人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


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

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


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

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


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

●質問者: onigirin
●カテゴリ:インターネット ウェブ制作
✍キーワード:MySQL PHP Rand アドバイス カラム
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kou32rr
●27ポイント

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

array_rand

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

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

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

◎質問者からの返答

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

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

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


2 ● pahoo
●27ポイント

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

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


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

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

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

◎質問者からの返答

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

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

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

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

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

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


3 ● pahoo
●26ポイント

#2で回答した者です。

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


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

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

?SQL文の実行

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ