Seite 1 von 2
SQL Group by und order by rand()
Verfasst: 04.06.2007, 22:08
von [btk]tobi
Ich habe eine Datenbank mit einer Spalte für den Wert, einer für die Gruppe und einer ID. Jetzt möchte ich von jeder Gruppe einen Wert auslesen, soweit auch kein Problem
Jetzt möchte ich aber für jede Gruppe einen zufälligen Wert
Code: Alles auswählen
SELECT wert FROM tabelle GROUP BY gruppe ORDER BY rand();
Das funktioniert aber leider nicht, es wird immer der erste Wert aus einer Gruppe ausgegeben. Jemand ne Idee?
Verfasst:
von
SEO Consulting bei
ABAKUS Internet Marketing Erfahrung seit 2002
- persönliche Betreuung
- individuelle Beratung
- kompetente Umsetzung
Jetzt anfragen:
0511 / 300325-0.
Verfasst: 04.06.2007, 22:32
von semtex
Ich weiss nicht ob ich Dich richtig verstanden habe, aber probiere es mal so :
$sql = "SELECT * FROM tabelle GROUP BY gruppe ORDER BY rand() ";
$ergebnis = mysql_query($sql);
while($row = mysql_fetch_object($ergebnis))
.
Verfasst: 04.06.2007, 22:37
von [btk]tobi
Ja, aber dabei wird immer nur der wert mit der höchsten ID aus der Gruppe ausgegeben, ich will aber einen zufälligen.
Verfasst: 05.06.2007, 00:05
von incubus
imho gibt es kein "order by rand" sondern nur desc und asc!
Du packst die Ergebnisse doch eh in ein Array. Schau dir mal array_rand an...
Verfasst: 05.06.2007, 00:12
von net(t)worker
incubus hat geschrieben:imho gibt es kein "order by rand" sondern nur desc und asc!
Du packst die Ergebnisse doch eh in ein Array. Schau dir mal array_rand an...
hmm... das sollteste aber sofort den Autoren vom offiziellen mySQL Manual mitteilen... die behaupten da ganz etwas anderes:
Quelle:
MySQL 5.1 Referenzhandbuch
....Allerdings können Sie Datensätze in zufälliger Folge abrufen. Das funktioniert wie folgt:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
...
...

Verfasst: 05.06.2007, 00:27
von incubus
hmm... das sollteste aber sofort den Autoren vom offiziellen mySQL Manual mitteilen... die behaupten da ganz etwas anderes:
Quelle: MySQL 5.1 Referenzhandbuch
Zitat:
....Allerdings können Sie Datensätze in zufälliger Folge abrufen. Das funktioniert wie folgt:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
...
...
Sorry, wusste ich nicht

Ich habe es bei mir getestet und es funktioniert -> SELECT objekt_id FROM objekt group by ort ORDER BY rand()
Evt. liegt es an deiner MySQL-Version.
Verfasst: 05.06.2007, 00:30
von [btk]tobi
Ich habe es bei mir getestet und es funktioniert -> SELECT objekt_id FROM objekt group by ort ORDER BY rand()
Dabei wird aber nur eine zufällige Gruppe ausgegeben,der Wert aus Gruppe 1 ist aber immer der gleiche.
Verfasst: 05.06.2007, 00:46
von incubus
Zitat:
Ich habe es bei mir getestet und es funktioniert -> SELECT objekt_id FROM objekt group by ort ORDER BY rand()
Dabei wird aber nur eine zufällige Gruppe ausgegeben,der Wert aus Gruppe 1 ist aber immer der gleiche.
Du hast Recht

Aber es ist auch logisch, da du ja mit "group by" Gruppen bildest und dann die Gruppen zufällig ausgegeben werden, aber ich verstehe da dein Problem

Eine Lösung habe ich leider nicht...
Gerade gefunden:
https://forum.de.selfhtml.org/archiv/2004/9/t89821/
Verfasst: 05.06.2007, 01:10
von net(t)worker
ich denke in einer einzelnen Abfrage, ohne unterabfrage o.ä. wird es nicht gehen.... das order by rand() gibt dir ja nur eine zufällige reihenfolge der vorstehenden Abfrage raus...
wenn es nicht zu viele gruppen sind könnteste für jede Gruppe einen zuifallswert abfragen.... eben der Nachteil, dass es pro Gruppe eine abfrage gibt...
Verfasst: 05.06.2007, 01:22
von [btk]tobi
Hab ich schon gelesen, Subselects gehen aber bei MySQL <= 4.0.25 nicht, das bringt mir also nichts.
wenn es nicht zu viele gruppen sind könnteste für jede Gruppe einen zuifallswert abfragen.... eben der Nachteil, dass es pro Gruppe eine abfrage gibt...
Ne, sind nur 4. Ich lese jetzt einfach alle spalten aus und schreib den wert für jede gruppe in ein Array das ich dann über die Gruppen ID abrufen kann.
Was ist schneller? eine tabelle mit X zeilen durch eine while-Schleife laufen lassen oder 4 Querrys?
Verfasst: 05.06.2007, 02:19
von net(t)worker
wenn du die keys entsprechend gesetzt hast dürften die 4 Abfragen recht flott gehen, bzw wären es ggf. 5 Abfragen, die erste um erstmal alle gruppen zu ermitteln und dann pro Gruppe eine abfrage abschicken....
select wert from table where gruppe='blabla' order by rand() limit 1;
ob es jetzt schneller als die whileschleife ist, hängt noch von anderen faktoren ab... da hilft dann zur Not nur ein livetest den du zigtausendmal nacheinander im vergleich durchlaufen lässt...
Verfasst: 05.06.2007, 18:44
von bloddy newbie
MySQL > 4.1?
Code: Alles auswählen
SELECT a.gruppe,
(SELECT b.wert FROM tabelle AS b WHERE a.gruppe = b.gruppe ORDER BY RAND() LIMIT 1) AS wert
FROM tabelle AS a
GROUP BY a.gruppe
Ansonsten halt mittels PHP durchschleifen und für jede Gruppe den zufälligen Wert abfragen.
cu Bloddy
Verfasst: 05.06.2007, 18:50
von [btk]tobi
MySQL > 4.1?
Genau das ist das Problem, das ganze ist für einen phpBB3 Mod gedacht und da muss man mit rechnen dass es Leute gibt die MySQL < 4.1 haben. Ich hab das jetzt mit PHP gelöst, ist zwar nicht so schon weil alle Zeilen erstmal durch eine Schleife laufen, aber es funktioniert.
Verfasst: 05.06.2007, 19:42
von Airport1
Achtung, zumindest frueher war RAND() bzgl. "echten Zufalls" absolut nicht zu gebrauchen, sprich: es ist nicht nur pseudo-Zufall womit man noch halbwegs leben koennte, sondern einer der schlechtesten Zufallsgeneratoren die ich mein Lebtag erlebt habe.. meine sogar die Zufallsgeneratoren von PHP waren dem meilenweit ueberlegen

Verfasst: 05.06.2007, 19:58
von net(t)worker
Airport1 hat geschrieben:Achtung, zumindest frueher war RAND() bzgl. "echten Zufalls" absolut nicht zu gebrauchen, sprich: es ist nicht nur pseudo-Zufall womit man noch halbwegs leben koennte, sondern einer der schlechtesten Zufallsgeneratoren die ich mein Lebtag erlebt habe.. meine sogar die Zufallsgeneratoren von PHP waren dem meilenweit ueberlegen

jo... im Mysql Handbuch wird auch explizit darauf hingewiesen...
RAND() ist nicht als perfekter Zufallsgenerator gedacht, sondern stellt eine gute Möglichkeit da, ad hoc Zufallszahlen zu erzeugen, die innerhalb derselben MySQL-Version plattformübergreifend funktioniert.
gut... die Worte sind nicht ganz so drastisch gewählt wie deine... aber ich glaube die meinen das selbe...
