SQL join zwei mal bei einer Tabelle
-
Hallo Leute.
Mein SQL ist ein bisschen eingerostet und jetzt hab ich da ein kleines Problem.
Und zwar ist in einer Datenbank eine Tabelle mit Produkten und eine mit Attributen zu den Produkten. So nun möchte ich eine Abfrage starten, welche mehrere Attributwerte beinhaltet.
Die Attributen-Tabelle enthält die Produktid, die Attributeid und den Wert.
Kann ich überhaupt das ganze in einer Abfrage abwikeln oder muss ich dazu mehrere Abfragen starten?
Mein Ansatz ist mit LEFT JOIN's die Attribute-Tabelle mehrfach ranzujoinen. Aber das scheint mir irgendwie suspekt, da ich in meiner SELECT-Anweisung nur einmal die Spalte aufzählen kann.
-
Wieso sollte das nicht gehen?
Deine beschriebene Tabellenstruktur sieht so aus:
Tabelle Produkte
produkt_id produkt_name
Tabelle Attribute
attribut_id attribut_name
Tabelle Produkt_Attribut
produkt_id attribut_id attribut_wert
Die Abfrage würde dann wohl so aussehen:
SELECT p.produkt_name AS produkt , a1.attribut_name AS attributname1 , pa_attribut1.attribut_wert AS wert1 , a2.attribut_name AS attributname2 , pa_attribut2.attribut_wert AS wert2 FROM produkte p INNER JOIN produkt_attribut pa_attribut1 ON p.produkt_id = pa_attribut1.produkt_id AND pa_attribut1.attribut_id = <gewuenschte_id> INNER JOIN attribute a1 ON pa_attribut1.attribut_id = a1.attribut_id INNER JOIN produkt_attribut pa_attribut2 ON p.produkt_id = pa_attribut2.produkt_id AND pa_attribut2.attribut_id = <gewuenschte_id 2> INNER JOIN attribute a2 ON pa_attribut2.attribut_id = a2.attribut_id
So hast du die Attribute spaltenweise aufgelistet. Du kannst natürlich auch die Tabellen einmal joinen, allerdings hast du dann pro Produkt und Attribut eine Zeile:
SELECT p.produkt_name AS produkt , a.attribut_name AS attributname , pa.attribut_wert AS wert FROM produkte p INNER JOIN produkt_attribut pa ON p.produkt_id = pa.produkt_id AND pa.attribut_id IN (<gewuenschte_ids>) INNER JOIN attribute a ON pa.attribut_id = a.attribut_id
Verzeih mir, wenn Fehler in den Querys sind, ich hab mehrfach drin rumgepfuscht, aber das Prinzip ist hoffentlich klar.