Sie können in einer ORDER BY-Klausel keine Spalte mit einem RAND()-Wert verwenden, da ORDER BY die Spalte mehrmals neu berechnet. In MySQL3.23 können Sie jedoch Folgendes tun: SELECT * FROM table_name ORDER BY RAND(), was hilfreich ist, um ein SELECT * FROM table1,table2 WHERE a=b AND c zu erhalten, um Zufälligkeit zu erreichen. Ich habe im Handbuch Folgendes gefunden Erklärung zur Erledigung der Aufgabe:
SELECT * FROM Tabellenname ORDER BY rand() LIMIT 5;
Rand sagt dies im Handbuch::
RAND()
RAND(N)
Gibt einen zufälligen Gleitkommawert im Bereich von 0 bis 1,0 zurück. Wenn ein ganzzahliger Parameter N angegeben wird, wird dieser als Startwert verwendet.
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
Sie können in einer ORDER BY-Klausel keine Spalte mit einem RAND()-Wert verwenden, da ORDER BY die Spalte mehrmals neu berechnet. In MySQL3.23 können Sie jedoch Folgendes tun: SELECT * FROM table_name ORDER BY RAND(), was hilfreich ist, um ein SELECT * FROM table1,table2 WHERE a=b AND c zu erhalten
Beachten Sie, dass ein RAND() in einer WHERE-Klausel jedes Mal neu ausgewertet wird, wenn WHERE ausgeführt wird.
Aber ich habe es versucht. Bei einer Tabelle mit 8.000 Datensätzen dauert die einmalige Ausführung 0,08 Sekunden, was etwas langsam ist. Später habe ich Google konsultiert und den folgenden Code erhalten:
SELECT * FROM Tabellenname AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM Tabellenname)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;
Die Ausführungseffizienz erfordert 0,02 Sekunden. Leider unterstützen nur MySQL 4.1.* und höher solche Unterabfragen.