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.


Anmelden zum Antworten