プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
MySQL、ランダムで取得したレコードに対してページング処理を行う
結論から書くと

SELECT * FROM tbl1 ORDER BY RAND(1);

のように「RAND()」の中に数字を入れると
同じ数字を入れる限りは同じ結果が取得できるので、
あとは、その結果に対して、ページング処理を行えばOKです。

例えば

SELECT * FROM tbl1 ORDER BY RAND(1) LIMIT 0,10;



SELECT * FROM tbl1 ORDER BY RAND(1) LIMIT 10,10;

を実行すると

SELECT * FROM tbl1 ORDER BY RAND(1) LIMIT 0,20;

の結果を2ページに分けて取得できます。

それでは、詳細を書いていきます。

ランダムに取得した結果に対してページング処理を行いたかったのです。
ところがどっこい

SELECT * FROM tbl1 ORDER BY RAND() LIMIT 0,10;

SELECT * FROM tbl1 ORDER BY RAND() LIMIT 10,10;

のような形で実行すると、そもそもの並びが1回目と2回目で違うので、
ページング処理になりません。

どうすれば、いーの(--?と疑問を覚えたのが今回のきっかけです。

ほんで、あれやこれやと調べて

SELECT * FROM tbl1 ORDER BY RAND(1) LIMIT 0,10;

SELECT * FROM tbl1 ORDER BY RAND(1) LIMIT 10,10;

のように「RAND()」の中に数字を入れれば良いと分かりました。
数字が同じだったら、並びも同じになるようです。

よって、1ページ目を取得するときは

1.プログラム内で乱数を取得
2.「1.」で取得した乱数を「RAND()」に入れてSQL実行
3.「2.」で「RAND()」に入れた値をセッションに入れる


としておき、違うページに移るときは

4.「3.」でセッションに入れた値を取得
5.「4.」で取得した乱数を「RAND()」に入れてLIMIT句を変えたSQL実行


とすることで、ランダムで取得したレコードのページング処理ができました。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● MySQL  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事