裏MySQLクエリー入門(15) 応用編3 MySQLで連番の仮想表を作成
postgresには連番の仮想表を作成できるgenerate_seriesという便利な関数があります。これは存在しない日付などを作るときに便利な関数です。MySQLではこのような関数はないのでユーザ変数を用いて擬似的に再現してみましょう。
SELECT 0 generate_series FROM DUAL WHERE (@num:=開始値-1)*0 UNION ALL SELECT @num:=@num+1 FROM 十分大きなテーブル LIMIT 終了値
- generate_series(1,20)*1
SELECT 0 generate_series FROM DUAL WHERE (@num:=1-1)*0 UNION ALL SELECT @num:=@num+1 FROM `information_schema`.COLUMNS LIMIT 20
とはいえ、十分なレコード数を持つテーブルが必要になったりとこれでは非効率なので、クライアント側のプログラミング言語でUNION ALLを使った仮想表を自動生成するメソッドを作った方が現実的でしょう。以下phpでの実装例です。phpのrangeメソッドそのものなので、これを利用して作ってみましょう。
<?php class sql{ // 連番の仮想表を生成します。 static function range($start,$end,$step=1){ return ' (SELECT ' .implode(' UNION ALL SELECT ', range($start,$end,$step)) .') '; } } $sql = 'SELECT * FROM '.sql::range(1,20).'t1'; $db->query($sql);
*1:`information_schema`.COLUMNSの行数が終了値より大きい場合