1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

many-to-many relation

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von creative7even, 03.01.08.

  1. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    Datenbank: MySQL (Version 4.2)

    wie bekomme ich mit einer DB-Abfrage alle Ergebnisse der linken Tabelle - und falls vorhanden natürlich auch die Einträge in der rechten Tabelle. Die MN Beziehung wird über eine 3tte Tabelle hergestellt.
    Momentan versuche ich den Join über die Where Klausel durchzuführen - mit dem Resultat, dass nicht alle Ergebnisse der linken Tabelle in der Ergebnismenge landen.

    Code:
    SELECT 
      car.id,car.brand,customer.id,customer.name
    FROM
      car,customer,car_customer
    WHERE
      car.id=car_customer.car_id AND customer.id=car_customer.customer_id
    
    Als Ergebnis bekomme ich hier alle Fahrzeuge die Bereits einen/mehrere Besitzer haben - nicht jedoch Fahrzeuge die keinen Besitzer haben. Ziel wäre eine Ergebnismenge die ALLE Fahrzeuge auflistet und - falls vorhanden auch die Besitzer liefert.

    kann mir da jemand auf die Sprünge helfen?
     
  2. drok

    drok Klarapfel

    Dabei seit:
    02.06.07
    Beiträge:
    278
    Hast du es denn schon mit einer LEFT JOIN - Abfrage probiert ?
     
    creative7even gefällt das.
  3. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    ja - aber ich scheitere an der Syntax :(
    wie könnte die Abfrage mit einem LEFT JOIN aussehen? Danke schonmal!
     
  4. _lux_

    _lux_ Bismarckapfel

    Dabei seit:
    23.11.07
    Beiträge:
    75
    die könnte z.b. so aussehen (ohne where-klausel)

    Code:
    SELECT 
      whatever
    FROM
      car c left outer join 
      car_customer cc on (c.car_id = cc.car_id) join
      customer cu on (cc.customer_id = cu.customer_id)
    
    damit würdest du alle datensätze aus car bekommen (auch wenn keine zuordnung zu customer vorhanden ist)
    und falls customers vorhanden sind, werden die natürlich auch noch mit gefetched
     
    creative7even gefällt das.
  5. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    danke - funktioniert!

    Code:
    SELECT 
      whatever
    FROM
      car c left join 
      car_customer cc on (c.car_id = cc.car_id) left join
      customer cu on (cc.customer_id = cu.customer_id)
    
     
    #5 creative7even, 03.01.08
    Zuletzt bearbeitet: 03.01.08
  6. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Diese Methode sollte auch funktionieren. Nur mal so als Info.

    Kann allerdings nicht sagen wie es mit der Performance zwischen diesen beiden Statements aussieht. Vielleicht weiß das ja jemand. Würde mich interessieren.

    duderino
     
  7. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    ich denke die deckt sich mit jener im ersten Post. Hat zum Nachteil, dass nur jene Datensätze ausgegeben werden die auch im Bezug zueinander stehen. Ich wollte ALLE Datensätze der linken Tabelle und wenn vorhanden die in Verbindung stehenden der rechten Tabelle.
     
  8. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Kannst du ja auch mit diesem Statement machen. Mit dem *:

     
  9. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    nö geht leider nicht...

    vielleicht zum besseren Verständnis:
    ich habe eine Tabelle Cars und eine Tabelle Customers.
    Cars und Customers sind mit einer MN-Tabelle verknüpft (1 Auto kann mehrere Käufer/Besitzer haben bspw Gebrauchtwagen, 1 Käufer kann mehrere Autos besitzen).
    Ich möchte als Ergebnismenge alle Autos (auch Neuwagen die keinen Besitzer haben), und falls vorhanden die dazugehörigen Besitzer.
    Dabei liefert das Statement aus dem letzten Post nur jene Autos die bereits einen Käufer/Besitzer haben - nicht jedoch die Neuwagen (die noch nicht verkauft wurden).
    lg.
     
  10. _lux_

    _lux_ Bismarckapfel

    Dabei seit:
    23.11.07
    Beiträge:
    75
    duderino: mit dem stern selektierst du nur die spalten, welche selektiert/ausgegeben werden sollen. das problem bei deinem statement ist die where-klausel, welche es insofern einschränkt, dass nur die datensätze geholt werden bei denen eine zuordnung zu customer UND car vorhanden ist.

    creative7even möchte aber auch zusätzlich alle datensätze bei denen keine zuordnung zu customer vorhanden ist.

    hoffe, das ist verständlich :/

    EDIT: crosspost mit creative7even .. läuft aufs gleiche hinaus :)
     
    #10 _lux_, 05.01.08
    Zuletzt bearbeitet: 05.01.08
  11. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Muesste man noch ein OR cu.customer_id IS NULL anfuegen.
     

Diese Seite empfehlen