Andy: (mysql) LEFT JOIN mit GROUP BY

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

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

    1. (Daraus, dass das überhaupt funzt, schliesse ich mal auf MySQL als DBMS).

      Das schließe ich auch. Und zwar messerscharf aus dem Postingtitel ;-)

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

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

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

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

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

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