(mysql) LEFT JOIN mit GROUP BY
Andy
- datenbank
0 Frank (no reg)0 Philipp Stephani0 Ilja
0 Philipp Stephani0 Ilja
Hallo,
ich hab hier ein kleines Problem.
Ich habe 2 Tabellen. In der ersten sind die User in einer anderen sind bildnamen zu der jeweiligen userID gespeichert. Dabei kann jeder User mehrere Bilder haben oder aber auch garkeine.
Jetzt brauche ich eine Abfrage die mir zu jeden User Maximal ein Bild liefert (kann ein zufallsbild sein, vorzugsweise aber das mit der niedrigsten ID). Dabei will ich bei Usern die keinen Bild haben einfach NULL zurück bekomen.
Ich habe es so versucht:
SELECT u.id, u.name, b.name AS picurl
FROM user u
LEFT JOIN bilder b
ON u.id = b.userid
GROUP BY b.userid
ORDER BY name ASC
Will aber nicht klappen da er nach dem ersten User der bei picurl eine NULL hat einfach aufhört.
Wenn ich es ohne GROUP BY mache dann bekomme ich für jeden user alle seine Bilder was ich auch nicht will.
Hat einer vielleicht eine Idee wie ich das machen kann?
Gruß und Danke
Andy
Servus,
könntest du bitte das verwendete Datenbanksystem inkl. Version mit angeben. Danach unterscheiden sich durchaus die Lösungsmöglichkeiten: Z.b. korellierende Unterabfrage.
Und übrigens gruppierst du nach einem Wert, denn du gar nicht in der SELECT Liste benutzt. Das dürfte so gar nicht funktionieren. (Daraus, dass das überhaupt funzt, schliesse ich mal auf MySQL als DBMS).
Aber bitte, du bist dran.
Ciao, Frank
(Daraus, dass das überhaupt funzt, schliesse ich mal auf MySQL als DBMS).
Das schließe ich auch. Und zwar messerscharf aus dem Postingtitel ;-)
yo,
Und übrigens gruppierst du nach einem Wert, denn du gar nicht in der SELECT Liste benutzt. Das dürfte so gar nicht funktionieren.
umgekehrt wird ein schuh draus ;-)
Ilja
Hallo,
ich wüsste jetzt nicht, wie das mit einer einzigen Query zu bewerkstelligen sein könnte. Lass dir erstmal eine Liste aller User-IDs zurückgeben und wähle dann zu jeder ID einen Eintrag aus:
SELECT u.id x, u.name, MIN(b.id) y
FROM user u LEFT OUTER JOIN bilder b
ON u.id = b.userid
GROUP BY b.userid
ORDER BY name ASC
dann:
SELECT b.name
FROM bilder b
WHERE b.id = y
yo,
Jetzt brauche ich eine Abfrage die mir zu jeden User Maximal ein Bild liefert (kann ein zufallsbild sein, vorzugsweise aber das mit der niedrigsten ID). Dabei will ich bei Usern die keinen Bild haben einfach NULL zurück bekomen.
der LEFT JOIN war schon der richtige ansatz, allerdings nicht im zusammenhang mit der gruppierung. die ist gerade bei mysql sehr tricky und verleitet die user. deine abfrage zum beispiel würde unter jemaden anderen dbms eine fehlermeldung ausgeben.
SELECT u.id, u.name, b.name AS picurl
FROM user u
LEFT JOIN bilder b ON u.id = b.userid
WHERE b.id = (SELECT MIN(b2.id) FROM bilder b2 WHERE b2.userid = u.id)
ORDER BY u.name ASC
die abfrage funkioniert erst ab mysql 4.1+
Ilja
die abfrage funkioniert erst ab mysql 4.1+
das ist es eben. Habe schon an subselect gedacht, habe aber mysql 4.0.
Zur zeit habe ich es mit zwei abfragen gelöst. in der ersten werden die User geholt in der zweiten dann in einer schleife die passenden bilder zu jedem user. Dachte halt man könnte das etwas optimierter lösen mit nur einer abfrage.
Andy
yo,
das ist es eben. Habe schon an subselect gedacht, habe aber mysql 4.0.
je nachdem geht es auch ohne subselect, dann aber wieder mit dem group by und nicht nach der kleinsten id sondern kleinsten bildname, wenn es sowieso nur ein zufälliges bild sein soll.
SELECT u.id, u.name, MIN(b.name) AS picurl
FROM user u
LEFT JOIN bilder b ON u.id = b.userid
GROUP BY u.id, u.name
ORDER BY u.name ASC
Ilja
SELECT u.id, u.name, MIN(b.name) AS picurl
FROM user u
LEFT JOIN bilder b ON u.id = b.userid
GROUP BY u.id, u.name
ORDER BY u.name ASC
ahhhhh :) danke
jetzt funzt es auch. mein fehler war das ich nach der Bilder tabelle gruppiert habe.