0

1,000レコードを含むMySQLデータベーステーブルがあり、ランダムに1レコードを選択したいとします。

レコードには、番号が毎回+1になるID列がありません。ID番号はランダムに生成されるため、最初のレコードIDは「932151540」、2番目のレコードIDは「541577961」になります。

ランダムに1つのレコードを選択することを考える唯一の方法は、合計でいくつのレコードがあるかを調べることです。1からいくつでも乱数を選びます(たとえば、乱数は467でした)。次に、467番目のレコードを取得します。

PHPを使用してこれを行うにはどうすればよいですか?

前もって感謝します :)

4

4 に答える 4

8
SELECT * FROM table ORDER BY RAND() LIMIT 1;
于 2012-05-22T22:21:41.840 に答える
6
SELECT *
FROM TABLE
ORDER BY RAND()
LIMIT 1
于 2012-05-22T22:21:45.897 に答える
1

使用できる代替クエリは次のとおりです。

SELECT * FROM myTable WHERE RAND()<(SELECT ((1/COUNT(*))*10) FROM myTable) ORDER BY RAND() LIMIT 1;これにより、テーブルのサイズが大きくなるにつれてパフォーマンスが大幅に向上します。

著者を引用するには:

このメソッドはORDERBYRAND()を使用しますが、テーブル行のごく一部にのみ使用されます。このパーセンテージは、必要な行数LIMIT 1をテーブルの行数COUNT(*)で割った値に基づいており、要求よりも少ない行が返されないように、その数値に10を掛けます。MySQL @ rndblog.comでランダムな行を選択する方法を読んだ後、このメソッドを開発しました。

詳細な説明とパフォーマンス分析、およびあなたのケースには当てはまらない可能性のある他の代替案については、こちらの投稿全体をお読みください。

于 2012-05-22T22:34:51.477 に答える
0

遅いORDER BY rand()の代わりにこれを使用すると、かなり高速になります。

$table = "mytable";
$offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM ".$table.";");
$offset_row = mysql_fetch_object($offset_result);
$offset = $offset_row->offset;
$result = mysql_query("SELECT * FROM ".$table." LIMIT ".$offset.", 1;"); 
$result_row = mysql_fetch_row($result);  // point to record
$row = $result_row[0];
于 2012-05-22T22:56:19.090 に答える