1

私はこれを行うためのより良い方法を探しています:

SELECT * FROM $tbl_name WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM $tbl_name ) ORDER BY id LIMIT 1;

それは遅く、あまりランダムではありません。10回ほどのクエリごとに同じ結果が得られます。

これにより、IDに関係なく、テーブルからランダムな行が選択されます。

これまでのところ私はこれを持っています:

// Get amount of rows in database
$result = mysql_query("SELECT * FROM $tbl_name");
$num_rows = mysql_num_rows($result);

// Generate random number
$random_row = rand(1, $num_rows);

しかし、特定の行を取得する方法がわかりません。

そういうことじゃなかったの

SELECT * FROM $tbl_name WHERE id = $random_row

私のデータベースではID列にギャップがあるため、失敗することがあります。

IDに応答せずにMySQLデータベースからランダムな結果を取得でき、超高速のスクリプトを入手した人はいますか?(データベースには約20000行が含まれています)

4

3 に答える 3

4
SELECT * FROM $tbl_name WHERE 1 ORDER BY RAND() LIMIT 1;

20,000行はそれほど多くはありませんが、上記は十分に高速である必要があります。

于 2012-04-21T20:22:36.627 に答える
1

Juhanaは、「ORDER BY RAND()LIMIT 1」という本にぴったりです。もちろん、20kはそれほど多くはありません。他のオプションは副選択であります:SELECT [fields] FROM myTable、(SELECT FLOOR(MAX(myTable.id)* RAND())AS randId FROM myTable)AS someRandId WHERE myTable.id = someRandId.randId

ここで説明します (不要な場合は*を選択しないでください)

于 2012-04-21T20:33:27.713 に答える
0

アディが送ったリンクへのコメントを検索した後、私はまともな解決策を見つけました。

SELECT * FROM $tbl_name T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM $tbl_name) AS x ON T.ID >= x.ID LIMIT 1; 

出典:wanderr.com/jay/order-by-slow/2008/01/30

非常に高速で非常にランダムなようです!

于 2012-04-28T13:36:47.943 に答える