Abfrage der Datenbank

jenno

Erfahrenes Mitglied
Folgende Situation:

Ich habe in einer Datenbank drei Tabellen zu Produkten:
- Produktkategorie (cat_id, name)
- Produktsorte (sort_id, cat_id, name)
- Produkttyp (typ_id, sort_id, name)

Diese Tabellen haben eine Beziehung zueinander über cat_id bzw. sort_id.

Als Datensätze gebe ich hier zwei Beispiele:

1.
Produktkategorie: 1, Elektronische Geräte
Produktsorte: 1, 1, Computer
Produkttyp: 1, 1, Scanner

2.
Produktkategorie: 2, Garten
Produktsorte: 2, 2, Möbel
Produkttyp: -

Es gibt also beim zweiten Beispiel ne Produktkategorie und ne Produktsorte, aber keinen Produkttyp mehr.

Ich hatte jetzt eine mysql-Abfrage

PHP:
SELECT DISTINCT k.name as kname, s.name as sname, t.name as tname FROM produktkategorie as k, produktsorte as s, produkttyp as t WHERE k.produktkategorie_id = s.produktkategorie_id AND s.produktsorte_id = t.produktsorte_id

Mit dieser Abfrage käme aber nur der erste Datensatz als Ausgabe. Mir ist auch klar, warum. Weil beim zweiten Datensatzbeispiel gibts ja keinen Produkttyp.

Meine Frage ist jetzt, gibt es eine Abfrage, mit der ich beide oben genannten Beispiele als Ergebnis erhalten würde
 
Verwende statt

SELECT DISTINCT k.name as kname, s.name as sname, t.name as tname FROM produktkategorie as k, produktsorte as s, produkttyp as t WHERE k.produktkategorie_id = s.produktkategorie_id AND s.produktsorte_id = t.produktsorte_id

lieber:

SELECT
DISTINCT k.name as kname, s.name as sname, t.name as tname FROM produktkategorie as k
LEFT JOIN produktsorte as s on s.produktkategorie=k.produktkategorie_id
LEFT JOIN produkttyp as t on s.produktsorte_id = s.produktsorte_id

das sollte funktionieren.
vop
 
Original geschrieben von jenno
Mit dieser Abfrage käme aber nur der erste Datensatz als Ausgabe. Mir ist auch klar, warum. Weil beim zweiten Datensatzbeispiel gibts ja keinen Produkttyp.

Meine Frage ist jetzt, gibt es eine Abfrage, mit der ich beide oben genannten Beispiele als Ergebnis erhalten würde
Ja, das Zauberwort heisst LEFT (OUTER) JOIN. Mit einem Cross (oder Equi) Join werden ja, wie Du richtig erkannt hast, nur die Datensätze selektiert, die in Verbindung zueinander stehen. Mittles dem Left Join werden ebenfalls diese Datensätze selektiert, aber auch diejenigen, die nicht über einen Schlüssel miteinander verbunden sind. Die Spalten die keine Verbindung haben werden hierbei mit NULL aufgefüllt.

http://www.infos24.de/mysqle/handbuch/12_mysql_joins.htm
 
Vielen Dank! Ihr seid spitze!

@vop:
Toll. Ja, es funktioniert. (Bis auf n kleinen Tipfehler beim zweiten Left Join, habn aber gefunden: s.produktsorte_id = t.produktsorte_id)

@chino:
Vielen Dank für das Tutorial. Mir war schon lange bewusst, dass ich da mit den Joins noch ne Lücke habe. Bisher bin ich immer noch drumherum gekommen. Werde jetzt aber gleich mal den Link von Dir durcharbeiten.

Super! :)
 

Neue Beiträge

Zurück