Mysql と PHP で、ランダムにデータを取り出す方法。



phpからデータをランダムに取り出す場合、

rand() 関数を使うと、非常に重くなってしまいます。


そこで、軽くてスマートな方法が無いか悩んでいます。

複数のカラムが必要で、ランダムデータは10個として考えています。


Mysqlからランダムにデータを取得する方法で、
良い方法がありましたらアドバイスお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/09/01 13:13:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kou32rr No.1

回答回数197ベストアンサー獲得回数8

ポイント27pt

mysqlでの負荷を避けるのであればPHP側でランダム取得をさせれば良いのでは?

array_rand

http://php.plus-server.net/function.array-rand.html

また、ランダムに表示させるのをアクセス毎にしないのであれば、

静的にincludeするファイルを書き出してしまえば良いと思います。

id:onigirin

array_randで10個ナンバーをピックアップして、そのナンバーのデータをselect×10回、ですね。

それか、データを全部selectした後、array_randでそこから10個選ぶ・・・。

こっちは重そうですね。。

2008/08/27 15:33:03
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント27pt

「phpからデータをランダムに取り出す場合」というのは「MySQLからデータをランダムに取り出す場合」の誤記だと思いますが、それにしても、ランダムデータが10個しかないのに「rand() 関数を使うと、非常に重くなってしまいます」というのが引っかかります。

スクリプトに問題があるのではないでしょうか?


MySQLにも RAND関数 があるので、これを使って

SELECT * FROM テーブル ORDER BY RAND();

のような SQL 文を書くことはできますが、rand 関数より速いという保証はありません。

id:onigirin

どうもありがとうございます。

mysqlのrand()を使っていたことがあって、

データ量が多くなると非常に重くて、サーバー会社から突如DBを全消去された

痛い思い出があって・・・。

そこで、DBからランダムで取り出すケースでは、

rand()をmysqlで使わずにできる良い方法はないかな、と模索してました。

2008/08/27 15:26:54
id:pahoo No.3

回答回数5960ベストアンサー獲得回数633

ポイント26pt

#2で回答した者です。

PHPのrand関数で時間がかかると勘違いしていました。ごめんなさい。


「MySQLのrand関数を使いたくない」というご要望であれば、LIMIT句を使ってみてはどうでしょう。以下、PHPスクリプトのイメージです。

$cnt = 10;    //レコード数
srand();
$n = (int)rand(1, $cnt);
$sql = "SELECT * FROM テーブル LIMIT {$n}, 1;";

~SQL文の実行

id:onigirin

どうもありがとうございます。

limitを使って、特定のレコードを1件取得、というのを繰り返せば、ランダム取得できそうですね。

データ全件取得後、phpでランダムにピックアップよりかなり軽そうですねぇ。

2008/08/27 17:06:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません