ORDER BY は列を複数回再計算するため、ORDER BY 句で RAND() 値を持つ列を使用することはできません。ただし、MySQL3.23 では、 SELECT * FROM table_name ORDER BY RAND() を実行できます。これは、ランダム性を達成するために SELECT * FROM table1,table2 WHERE a=b AND c を取得するのに役立ちます。マニュアルから次のことがわかりました。タスクを完了するためのステートメント:
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
rand はマニュアルで次のように述べています::
ランド()
ランド(N)
0 ~ 1.0 の範囲のランダムな浮動小数点値を返します。整数パラメータ N が指定されている場合、それがシード値として使用されます。
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888
ORDER BY は列を複数回再計算するため、ORDER BY 句で RAND() 値を持つ列を使用することはできません。ただし、MySQL3.23 では、 SELECT * FROM table_name ORDER BY RAND() を実行できます。これは、 SELECT * FROM table1,table2 WHERE a=b AND c を取得するのに役立ちます。
WHERE 句内の RAND() は、WHERE が実行されるたびに再評価されることに注意してください。
ただし、8,000 件のレコードがあるテーブルの場合、1 回の実行に 0.08 秒かかり、少し遅いです。その後、Google に問い合わせたところ、次のコードが得られました。
SELECT * FROM table_name AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;
残念ながら、このようなサブクエリをサポートしているのは mysql 4.1.* 以降だけです。