Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

SQL Group by und order by rand()

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
[btk]tobi
PostRank 8
PostRank 8
Beiträge: 890
Registriert: 11.10.2004, 05:02
Wohnort: Stuttgart

Beitrag von [btk]tobi » 04.06.2007, 22:08

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

Code: Alles auswählen

SELECT wert FROM tabelle GROUP BY gruppe;
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?

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


semtex
PostRank 6
PostRank 6
Beiträge: 381
Registriert: 25.04.2007, 22:50

Beitrag von semtex » 04.06.2007, 22:32

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))


.
Zuletzt geändert von semtex am 04.06.2007, 22:37, insgesamt 1-mal geändert.

[btk]tobi
PostRank 8
PostRank 8
Beiträge: 890
Registriert: 11.10.2004, 05:02
Wohnort: Stuttgart

Beitrag von [btk]tobi » 04.06.2007, 22:37

Ja, aber dabei wird immer nur der wert mit der höchsten ID aus der Gruppe ausgegeben, ich will aber einen zufälligen.

incubus
PostRank 5
PostRank 5
Beiträge: 220
Registriert: 02.01.2006, 01:42

Beitrag von incubus » 05.06.2007, 00:05

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...

Anonymous

Beitrag von Anonymous » 05.06.2007, 00:12

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...
:o

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();
...
...
:wink:

incubus
PostRank 5
PostRank 5
Beiträge: 220
Registriert: 02.01.2006, 01:42

Beitrag von incubus » 05.06.2007, 00:27

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 :oops: 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.

[btk]tobi
PostRank 8
PostRank 8
Beiträge: 890
Registriert: 11.10.2004, 05:02
Wohnort: Stuttgart

Beitrag von [btk]tobi » 05.06.2007, 00:30

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.

incubus
PostRank 5
PostRank 5
Beiträge: 220
Registriert: 02.01.2006, 01:42

Beitrag von incubus » 05.06.2007, 00:46

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/

Anonymous

Beitrag von Anonymous » 05.06.2007, 01:10

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...

[btk]tobi
PostRank 8
PostRank 8
Beiträge: 890
Registriert: 11.10.2004, 05:02
Wohnort: Stuttgart

Beitrag von [btk]tobi » 05.06.2007, 01:22

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?

Anonymous

Beitrag von Anonymous » 05.06.2007, 02:19

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...

bloddy newbie
PostRank 4
PostRank 4
Beiträge: 171
Registriert: 18.05.2006, 20:15

Beitrag von bloddy newbie » 05.06.2007, 18:44

MySQL > 4.1?

Code: Alles auswählen

SELECT a.gruppe, 
&#40;SELECT b.wert FROM tabelle AS b WHERE a.gruppe = b.gruppe ORDER BY RAND&#40;&#41; LIMIT 1&#41; 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

[btk]tobi
PostRank 8
PostRank 8
Beiträge: 890
Registriert: 11.10.2004, 05:02
Wohnort: Stuttgart

Beitrag von [btk]tobi » 05.06.2007, 18:50

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.

Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 05.06.2007, 19:42

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 ;)
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Anonymous

Beitrag von Anonymous » 05.06.2007, 19:58

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... :wink:

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag