2004-03-12, 20:24
>SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND()
>in jedem durchgang der where clause neu ausgewertet wird.
was hier mit ausgewertet gemeint ist, weiß ich net genau.
Die Zufallszahl muss bei jeder Zeile neu generiert werden, sonst haut das ja net hin.
Ich hätte es ja intuitive so geschrieben:
SELECT *, RAND() AS randomValue FROM table ORDER BY randomValue
aber wenn ich mich richtig erinnere, hatte das in MySQL net hingehauen. Ich glaube sogar, dass die von dir zitierte Zeile oben im MySQL Handbuch so drinnen steht.
Aber vielleicht wäre es sowieso besser es so zu machen (ist mir jetzt gerade eingefallen):
Auf Datenbank: SELECT COUNT(1) FROM table
Dann eine Zufallszahl zwischen 0 und der zurückgegebenen Anzahl erzeugen
dann wieder auf der DB: SELECT * FROM table LIMIT <Zufallszahl>, 1
geht aber nur mit MySQL. SQL-Server hat kein LIMIT , nur ein TOP. Bei Oracle weiß ich es nicht mehr. Allerdings sind dann 2 Datenbank-Roundtrips notwendig. MySQL hat ja keine Stored Procs. Aber ich brauch halt nur eine Zufallszahl erzeugen. Bei ganz großen Datenmengen könnte es aber schneller sein. Müsste man testen.
>in jedem durchgang der where clause neu ausgewertet wird.
was hier mit ausgewertet gemeint ist, weiß ich net genau.
Die Zufallszahl muss bei jeder Zeile neu generiert werden, sonst haut das ja net hin.
Ich hätte es ja intuitive so geschrieben:
SELECT *, RAND() AS randomValue FROM table ORDER BY randomValue
aber wenn ich mich richtig erinnere, hatte das in MySQL net hingehauen. Ich glaube sogar, dass die von dir zitierte Zeile oben im MySQL Handbuch so drinnen steht.
Aber vielleicht wäre es sowieso besser es so zu machen (ist mir jetzt gerade eingefallen):
Auf Datenbank: SELECT COUNT(1) FROM table
Dann eine Zufallszahl zwischen 0 und der zurückgegebenen Anzahl erzeugen
dann wieder auf der DB: SELECT * FROM table LIMIT <Zufallszahl>, 1
geht aber nur mit MySQL. SQL-Server hat kein LIMIT , nur ein TOP. Bei Oracle weiß ich es nicht mehr. Allerdings sind dann 2 Datenbank-Roundtrips notwendig. MySQL hat ja keine Stored Procs. Aber ich brauch halt nur eine Zufallszahl erzeugen. Bei ganz großen Datenmengen könnte es aber schneller sein. Müsste man testen.