• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

many-to-many relation

creative7even

Jerseymac
Registriert
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?
 

_lux_

Bismarckapfel
Registriert
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
 
  • Like
Reaktionen: creative7even

creative7even

Jerseymac
Registriert
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)
 
Zuletzt bearbeitet:

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Diese Methode sollte auch funktionieren. Nur mal so als Info.

SELECT
bla
FROM
car c, car_customer cc, customer cu
WHERE
c.car_id = cc.car_id AND cc.customer_id = cu.customer_id

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

duderino
 

creative7even

Jerseymac
Registriert
23.02.05
Beiträge
454
Diese Methode sollte auch funktionieren...[...]

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.
 

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Kannst du ja auch mit diesem Statement machen. Mit dem *:

SELECT
c.*, cc.bla, cu.bla
FROM
car c, car_customer cc, customer cu
WHERE
c.car_id = cc.car_id AND cc.customer_id = cu.customer_id
 

creative7even

Jerseymac
Registriert
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.
 

_lux_

Bismarckapfel
Registriert
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 :)
 
Zuletzt bearbeitet:

kauan

Stina Lohmann
Registriert
31.12.05
Beiträge
1.043
Muesste man noch ein OR cu.customer_id IS NULL anfuegen.