PHP+MySQLでランダムにレコード取得し、順番を維持してページングする方法

タイトルが微妙な気がするけど、他に表現を思いつかなかった。

MySQLでランダムにレコードを取得する場合、

SELECT * FROM example_table ORDER BY RAND()

と、するとSQLを実行する毎に毎回ランダムな結果を返してくれる。

但し。このままではLIMIT値と組み合わせてページングする場合に、ページングした時点で再度RANDを実行してしまうので、順番が崩れてしまう。
既に「前のページ」で表示したレコードを再表示したり、「前のページ」に戻っても、同一の結果を得る事が出来ない。

これではページングの意味が全くない。

その問題の解決方法。RANDに整数値を与える事で、RANDは同一整数の場合に同一の結果を返してくれる。

 SELECT * FROM example_table ORDER BY RAND(N) 

こんな感じ。これを利用する。

例えば・・・

if($_GET['seed']){ $seed = $_GET['seed']; }
else{ $seed = mt_rand(0,9999); }
$seed = mysql_real_escape_string($seed);
$sql = 'SELECT * FROM example_table ORDER BY RAND($seed) LIMIT 0,10';

こんな感じ。
リンクを出力する時にページ番号と共に種値も渡すようにすれば良いかな。

ちなみにこのRAND(N)、SQLiteでは使えないようなので、SQLiteでやる場合は…
ランダム出力したいテーブルにソート用のカラムを一つ用意して、cronとかで定期的に全レコードのソート用カラムにランダムに数値を与えて、そのカラムを基準にソートしてやるとかでいいのかな。

2010年05月03日  タグ:

Leave a Reply