Verfasst: 01.08.2008 01:27
. Ich möchte es aber zwar gern so, dass z.B. der Vorname per Zufall ausgelesen wird. Nur sollen die anderen Informationen aus der gleiche Zeile stammen. Wie mache ich das?
Code: Alles auswählen
SELECT `user_regdate` FROM `phpbb3_users` WHERE `username` = (SELECT `username` FROM `phpbb3_users` WHERE `user_id` = CEILING(RAND() * (SELECT COUNT(*) FROM `phpbb3_users`)) LIMIT 1);
Sofortlösung
Code: Alles auswählen
SELECT * FROM `phpbb3_users` WHERE `user_id` = CEILING(RAND() * (SELECT COUNT(*) FROM `phpbb3_users`)) LIMIT 1;
-----------------------------------------
Ich nehme mir hier die Freiheit und beschreibe die Abfrage, damit du sie nach deinen eigenen Vorstellungen gestalten kannst.
Ich habe die Erklärung extra so verfasst, dass man dem Code 1 zu 1 folgen kann.
Eines Vorweg, man kann mehrere Informationen in einer Abfrage abfragen, indem man Klammern setzt (der MySQL Interpreter kommt dadurch auch nicht durcheinander).
Vom dem Gedankengang ist es wie eine Rechnung.
Code: Alles auswählen
$i = 4 * (3+2);
$i = 4 * 5;
$i = 20;
Dieser wird ausgewählt anhand des Feldes `user_id`.
Dieses wiederum wird durch einen Zufallswert (RAND()) mal der maximalen Datensatzmenge (Zähle alle Datensätze aller Felder aus der Tabelle ==> (SELECT COUNT(*) FROM `phpbb3_users`)). Runde das Ergebnis (CEILING(...)), damit eine schöne ganze Zahl (bzw. ID) übergeben werden kann.
Durch die Rundung (und die Anzahl der Datensätze) bekommt man eine ID, mit der man einen Usernamen bestimmen kann und mit diesem kann man die restlichen Felder bestimmen.
-----------------------------------------
Besser wäre es also alle benötigten Informationen in einer Abfrage (ohne Verschachtelung) unter zu bringen.
Also etwa so.
Code: Alles auswählen
SELECT * FROM `phpbb3_users` WHERE `user_id` = CEILING(RAND() * (SELECT COUNT(*) FROM `phpbb3_users`)) LIMIT 1;
Um immer ein Ergebnis zu bekommen, ist es sinnvoll eine eigene (Random-)Spalte anzulegen und diese mit zufälligen Werten zu füllen (ein Zufallswert pro Datensatz).
(Random-)Spalte füllen:
Code: Alles auswählen
UPDATE `phpbb3_users` SET `random` = RAND();
Code: Alles auswählen
SELECT * FROM `phpbb3_users` WHERE `random` > RAND() ORDER BY `random` LIMIT 1
Allerdings muss ab nun die Randomspalte immer mit gefüllt werden (da sonst immer aus den gleichen Gewählt wird).
Gruß atrox