2011-11-20 16 views
10

私はPHPを使用して私のSQLテーブルから5つのランダムな行を要求したいと思います。その価値は、大量の行を持つテーブル上のランド()を使用して遅くなるしようとしていることに注意してください何のためPHPを使用してSQLからランダムな行を選択

mysql_query("SELECT * FROM catalogue >> not sure what goes here << LIMIT 5"); 
+4

まったく同じ質問のある関連トピックに気づかれませんか? –

答えて

19
SELECT * FROM catalogue order by RAND() LIMIT 5 

編集: は、例えば、iがする必要があります。これは実際にサーバーをクラッシュさせる可能性があります。

いくつかのソリューション:

MediaWikiは(:ランダム機能ウィキペディアのスペシャル):面白いトリックを使用して記事を持つテーブルは(記事が作成されたときに生成)乱数で余分な列を持っています。ランダムな記事を取得するには、乱数を生成し、乱数列の次の大きい方または小さい方の値を持つアーティクルを取得します。インデックスを使用すると、これは非常に高速になります。 (そしてMediaWikiはPHPで書かれ、MySQLのために開発されました)

しかし、これは単一のランダムな行だけです。

+0

次のようなものを使用すると良いですか? SELECT * FROMカタログwhere user_type = 'regular' order by RAND()LIMIT 5 ???? –

+0

@GuchoCa、はい、それは問題ありません。テーブルサイズが大きくなってこのクエリで長い時間を費やし始めたら、MediaWikiのようにそれを減らす方法を考え出す必要があります。 – Pheonix

+0

あなたはテーブルの長さを知る(テーブルのレコード数を確認し、レコードの大量の500Kを想定するなど)、その合計から5つの数字をランダムに選んで、その5つのレコードをテーブルから取り出します?そのランダムIDが見つからない場合は – Ali

3

あなたは非常に大きなテーブルからランダムに行を選択している場合は、以下のリンクでのアプローチを試してみたいことがあります。

http://akinas.com/pages/en/blog/mysql_random_row/

注:ちょうど誰も

で他のオプションを共有しますテーブルを想定し
5

はあなたのAUTO INCREMENTが

SELECT id FROM catalogue ORDER BY id DESC LIMIT 1 

の最大のIDと最小のIDのウィットを得ることができています時間それが可能あなたがランダムIDを5回作成することができ、5行については、この

$randomId = mt_rand($smallestId, $biggestId); 
$randomSql = mysql_query("SELECT * FROM catalogue WHERE id='$randomId'"); 

を行うために作る

SELECT id FROM catalogue ORDER BY id ASC LIMIT 1 

+0

ですが、クエリは失敗します – warren

関連する問題