ランダムで取得してページング
2008/07/20 | MySQL
データをランダムな順番で取得するには以下のorder句をつければいいということは前に書いた。
order by rand()
これで確かにランダムな順番でデータを吐き出してくれるのだが、SQL実行毎に順番が変わってしまう(当たり前)。ページング処理を実行したい場合は、1ページ目と2ページ目を表示する際に、順番に(例えば)10件ずつデータを取ってくるわけだが、そもそも順番がめちゃくちゃなので、1ページ目のデータが2ページ目でまた出現してしまう、といったことが起きてしまう。どうすればよいか。解決策がコレ。
order by rand(n)
nは適当な数値
詳しくは調べていないがnは乱数を発生させる際のseed値のようなもの。このseed値が同じであれば、並び順は常に同じになるのだ。なのでデータ取得の一番最初のときにこのseed値を初期化して、以降のページングの際はこのseed値を持ちまわってSQL文に仕込んでやればよいということになる。