SQL: Problem mit Group By und Order By
Dieter
- datenbank
Hallo,
ich habe eine Tabelle (MySQL), die ist in etwa wiefolgt aufgebaut:
id, userId, kommentar
1, 1, ...
2, 2, ...
3, 1, ...
Dabei ist id der Primärschlüssel und gleichzeitig auto_increment.
Jetzt möchte ich eine List ausgeben, wo einmal der User auftaucht und sein erster Kommentar (also der Kommentar mit der kleinsten ID für den jeweiligen User), sprich ich muss die Tabelle auslesen, gruppiert nach userId und jeweils die kleine Id.
Ich habe es so versucht:
SELECT * FROM table GROUP BY userId
Leider können dort Ergebnisse wie folgt auftauchen:
id, userId, kommentar
3, 1, ..
2, 2, ..
Was ich aber haben möchte:
id, userId, kommentar
1, 1, ...
2, 2, ...
Auch ORDER BY usw. bringt mich nix weiter.
Weiß jmd. Rat?
Mit 2 Abfragen würde es so aussehen:
Ich durchlauf in einer Schleife alle userIds, und rufe dann folgende SQL Anweisung auf:
SELECT * FROM table WHERE userId = '[die_id_des_aktuellen_Users] ORDER BY id LIMIT 1
Nur würde ich es gerne in 1 SQL Anweisung packen.
Hoffentlich weiß wer Rat.
MFG
Hi,
du könntest es mal so versuchen:
SELECT * FROM table GROUP BY userId HAVING id = MIN(id)
Ansonsten such mal nach HAVING.
Gruß
Christian
Hallo,
SELECT * FROM table GROUP BY userId HAVING id = MIN(id)
Dies führt leider dazu, dass ich nur 1 Datensatz bekomme, und zwar den mit der kleinsten Id (Id=1)
Mal schauen ob ich da morgen was hinbekomme, aber wie es aussieht, kann ich leider kein weiteres SELECT in MIN() integrieren (MySQL 5.0)
MFG
Hallo,
danke Îlja und Christian, ich hab es hinbekommen.
Die Abfrage sieht nun so aus:
SELECT a.id, a.userId FROM table
AS a WHERE a.id IN (SELECT MIN(b.id) FROM table AS b GROUP BY b.userId)
Erste Tests zeigten, dass es geht, nur hoffen, dass es nachher auf dem Produktivsystem mit MySQL 4.1.13 auch klappt, da leider die MySQL-Ref nicht schreibt, welche Version vorrausgesetzt wird.
MFG
yo,
bei jedem anderen dbms würdest du bei deiner abfrage eine fehlermeldung bekommen. bei gruppierungen kannst du nur spalten ausgeben, über die du gruppiert hast oder die eine aggregat-funktion benutzen. mysql umgeht das, indem es zufällige werte anzeigt, wenn du die regel verletzt.
Nur würde ich es gerne in 1 SQL Anweisung packen.
das stichwort für dich sind korrelierte unterabfragen. diese gehen ab mysql version 4.1. schau mal, welche version du benutzt, dann können wir dir weiterhelfen.
Ilja