Olaf: MySQL Select mit Outer Join

Hallo,

ich habe ein kleines Problem mit folgendem Select:

SELECT user.uid, count( car_main.cnr )  FROM user LEFT  OUTER  JOIN car_main USING ( uid )  WHERE user.uid = 770 AND date_format( car_main.updated,  "%d.%m.%Y"  )  =  "16.01.2004" GROUP  BY cnr;

In der Tabelle stehen, wie der Name schon sagt, die User-Daten drin und in der Tabelle car_main ein paar Angaben zu den Autos der User. Ich möchte mit dem Select jetzt den User 770 ausgegeben haben. Wenn in der Tabelle car_main kein entsprechender Satz mit dem Datum 16-01-2004 in der Spalte updated enthalten ist, soll er trotzdem zumindest die User-ID ausgeben. Leider bekomme ich mit dem Select-Befehl aber nur die User-ID angegeben, wenn ich ein Datum wähle, zu dem ein Satz in der Tabelle für den User enthalten ist...

Weiß jemand Rat?

Gruß
Olaf

  1. Hallo,

    ich habe ein kleines Problem mit folgendem Select:

    SELECT user.uid, count( car_main.cnr )  FROM user LEFT  OUTER  JOIN car_main USING ( uid )  WHERE user.uid = 770 AND date_format( car_main.updated,  "%d.%m.%Y"  )  =  "16.01.2004" GROUP  BY cnr;

    Leider bekomme ich mit dem Select-Befehl aber nur die User-ID angegeben, wenn ich ein Datum wähle, zu dem ein Satz in der Tabelle für den User enthalten ist...

    Klar, Du bekommst nur die Datensätze, die der WHERE-Klausel entsprechen, wie sollte es sonst sein? Meiner Meinung nach, wäre alles Andere falsch ;-))

    SELECT user.uid, count( car_main.cnr )  FROM user LEFT OUTER JOIN car_main USING ( uid ) GROUP BY cnr HAVING user.uid = 770

    viele Grüße

    Axel

    1. Hallo,

      Klar, Du bekommst nur die Datensätze, die der WHERE-Klausel entsprechen, wie sollte es sonst sein? Meiner Meinung nach, wäre alles Andere falsch ;-))

      Hmm, kenne ich aber so von ORACLE-DBs.

      SELECT user.uid, count( car_main.cnr )  FROM user LEFT OUTER JOIN car_main USING ( uid ) GROUP BY cnr HAVING user.uid = 770

      So bekomme ich ja auch count(car_main.cnr) > 0 für User, dessen Eintrag in car_main mit Spalte updated != 16.01.2004 ist. In diesen Fällen möchte ich aber als Ergebnis für den Count (0) haben. Deswegen hatte ich die where-Bedingung

      date_format( car_main.updated,  "%d.%m.%Y"  )  =  "16.01.2004"

      noch eingebaut...

      Verstanden oder zu umständlich formuliert?

      Gruß
      Olaf

  2. yo,

    mir ist nicht klar, warum die group by über die spalte cnr geht. aber versuch mal

    SELECT user.uid, count(car_main.cnr)
    FROM user LEFT OUTER JOIN car_main
    ON (user.uid = car_main.cnr AND date_format(car_main.updated,"%d.%m.%Y")="16.01.2004" )
    WHERE user.uid = 770
    GROUP  BY cnr;

    Ilja

    1. Hallo Ilja,

      danke, das wars. Hier der korrekte Befehl:

      SELECT user.uid, count( car_main.cnr)
      FROM user
      LEFT OUTER JOIN car_main ON ( user.uid = car_main.uid AND date_format( car_main.updated, "%d.%m.%Y" ) = "17.01.2004" )
      WHERE user.uid = 770
      GROUP BY 1

      Ich ging davon aus, dass in ON nur Abgleichungen der beiden Tabellen reindürften...

      Gruß
      Olaf

      yo,

      mir ist nicht klar, warum die group by über die spalte cnr geht. aber versuch mal

      SELECT user.uid, count(car_main.cnr)
      FROM user LEFT OUTER JOIN car_main
      ON (user.uid = car_main.cnr AND date_format(car_main.updated,"%d.%m.%Y")="16.01.2004" )
      WHERE user.uid = 770
      GROUP  BY cnr;

      Ilja