[mysql] LEFT JOIN

Cäptin Pommes

Erfahrenes Mitglied
hi,

ich hab folgendes problem:

Ich hab ne Tabelle Produzenten und eine Tabelle Bilder.
Nun müssen jedem Produzenten seine Bilder zugeordnet werden, so wie ich rausgefunden habe benutzt man dafür eine 3te Tabelle Produzenten_Bilder, wo dann die jeweiligen id´s zusammen stehn ... Jedoch weiss ich nich so recht wie ich dann alle Bilder von einem bestimmten Produzenten raussuchen kann ... nach meinen infos soll das wohl LEFT JOIN klappen ... aber ich werd da nich so ganz schlau drauß ... auch die mysql doku hat mir nich weiter geholfen

kann mir da einer bei dem mysql befehl helfen?
 
Gehört ein Bild immer zu genau einem Produzenten? Dann brauchst du keine dritte Tabelle, sondern die Tabelle "Bilder" bekommt eine Spalte "Produzent_id"
 
Ok, weil du geschrieben hast "Nun müssen jedem Produzenten seine Bilder zugeordnet werden". Das klang so, als wäre es 1:N


Tabellen:

Produzenten
id | name

Bilder
id | pfad

Produzenten_Bilder
Produzent_id | Bild_id


Alle Bilder für Produzent "1337"

SQL:
SELECT			b.pfad
FROM			Bilder AS b
JOIN			(Produzenten_Bilder AS pb) ON (pb.Produzent_id = 1337 AND pb.Bild_id = b.id)
 
Die einfachste Art sich einen JOIN vorzustellen, ist das Kreuzprodukt (auch wenn es intern anders abläuft).

Also stell dir vor jede Zeile von Tabelle "Bilder" wird mit jeder Zeile in Tabelle "Produzenten_Bilder" zu einer Zeile vereinigt (join) und anschließend werden die Zeilen anhand der angegebenen Bedingung gefiltert.


Hast du z.B. folgende Beispiel Werte

Bilder:
id | pfad
1 | foo.jpg
2 | bar.jpg
3 | baz.jpg

Produzenten_Bilder
Produzent_id | Bild_id
43 | 1
1337 | 1
1337 | 3


Entsteht folgendes Kreuzprodukt
Bilder.id | Bilder.pfad | Produzenten_Bilder.Produzent_id | Produzenten_Bilder.Bild_id
1 | foo.jpg | 43 | 1
1 | foo.jpg | 1337 | 1
1 | foo.jpg | 1337 | 3
2 | bar.jpg | 43 | 1
2 | bar.jpg | 1337 | 1
2 | bar.jpg | 1337 | 3
3 | baz.jpg | 43 | 1
3 | baz.jpg | 1337 | 1
3 | baz.jpg | 1337 | 3


Jetzt werden alle Zeilen durchlaufen und auf die Bedingung geprüft (pb.Produzent_id = 1337 AND )


Also bleibt das hier übrig

Bilder.id | Bilder.pfad | Produzenten_Bilder.Produzent_id | Produzenten_Bilder.Bild_id
1 | foo.jpg | 43 | 1
1 | foo.jpg | 1337 | 1
1 | foo.jpg | 1337 | 3
2 | bar.jpg | 43 | 1
2 | bar.jpg | 1337 | 1
2 | bar.jpg | 1337 | 3
3 | baz.jpg | 43 | 1
3 | baz.jpg | 1337 | 1
3 | baz.jpg | 1337 | 3

Und das sind genau die beiden Bilder von Produzent 1337.



In Realität ist ein Kreuzprodukt viel zu aufwändig, aber jeder JOIN lässt sich immer auch so abbilden und verstehen.


Edit: Und bei einem LEFT JOIN (der hier nicht verwendet wurde), würden alle Zeilen von Tabelle "Bilder" auf jeden Fall vorkommen, auch wenn es keine Verbindung zu Produzenten_Bilder gibt. In unserem Beispiel hat aber jedes Bild auch einen Produzenten, also wäre das Ergebnis identisch. Mit einem LEFT JOIN ließen sich z.B. alle Produzenten finden, die keine Bilder haben.
 
Zuletzt bearbeitet:
ahhja ok ...

und wenn ich alle Produzenten des bilds 5 haben will müsste das so aussehn oda?

SQL:
SELECT          p.name
FROM            Produzent AS p
JOIN            (Produzenten_Bilder AS pb) ON (pb.Bild_id = 5 AND pb.Produzenten_id = p.id)
 
Zurück