裏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での実装例です。phprangeメソッドそのものなので、これを利用して作ってみましょう。

<?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の行数が終了値より大きい場合