it-swarm.com.de

SQL Join auf Junction-Tabelle mit vielen zu vielen Relationen

Ich habe drei Tabellen, von denen 2 reguläre Datentabellen und 1 eine viele zu viele Junction-Tabelle sind.

Die zwei Datentabellen:

table products

product_id | product_name | product_color
-----------------------------------------
1          | Pear         | Green
2          | Apple        | Red
3          | Banana       | Yellow

und

table shops

shop_id    | shop_location
--------------------------
1          | Foo street
2          | Bar alley
3          | Fitz lane

Ich habe eine Junction-Tabelle, die die shop_id und product_id enthält:

table shops_products

shop_id    | product_id
--------------------
1          | 1
1          | 2
2          | 1
2          | 2
2          | 3
3          | 2
3          | 3

Ich möchte Daten aus Produkten auswählen, die mit shop_id 3 im Shop sind. Ich habe von hier aus viele Beispiele mit Joins, Left Joins und Inner Joins ausprobiert, aber ich weiß einfach nicht, was ich hier mache und was falsch läuft. Die Abfrage, die ich hatte, aber nur alle Produkte zurückgab, unabhängig davon, ob sie sich im angegebenen Shop befinden, lautet wie folgt:

SELECT products.product_name, products.product_color
FROM products
LEFT OUTER JOIN shops_products
ON products.product_id = shops_products.product_id
AND shops_products.shop_id = 3
LEFT OUTER JOIN shops
ON shops_products.shop_id = shops.shop_id

Die erwartete Ausgabe ist die folgende:

product_name | product_color
----------------------------
Apple        | Red
Banana       | Yellow

Dies ist in MySQL, danke für jede Hilfe, ich weiß es wirklich zu schätzen.

9
B_s

Ich beginne gerne von außen und gehe hinein. Stellen Sie sich also vor, alle Säulen wären in nur einem Tisch zusammengestaut. Sie könnten so etwas schreiben wie:

SELECT *
FROM products
WHERE shop_id = 3

Sie müssen dann nur noch die Joins hinzufügen, um diese Anweisung zu ermöglichen. Wir wissen, dass wir als nächstes die Verknüpfungstabelle hinzufügen müssen (da diese direkt mit der Produkttabelle verknüpft wird, da sie die product_id enthält). Dieser Join ist das, was als nächstes kommt:

SELECT products.*
FROM products
INNER JOIN shops_products
ON products.product_id = shops_products.product_id
WHERE shops_products.shop_id = 3

und tatsächlich können Sie hier aufhören ... weil shop_id bereits in der Join-Tabelle existiert. Nehmen wir aber an, Sie wollten auch den Speicherort des Shops in der Gruppe der letzten Spalten, und fügen dann den Shop-Table-Join hinzu.

SELECT products.*, shops.shop_location
FROM products
INNER JOIN shops_products
ON products.product_id = shops_products.product_id
INNER JOIN shops
ON shops_products.shop_id = shops.shop_id
WHERE shops_products.shop_id = 3
29
Taryn East

Sie können dies versuchen.

SELECT products.product_name, products.product_color
FROM products
INNER JOIN shops_products
ON products.product_id = shops_products.product_id
WHERE shops_products.shop_id = 3
1
Vamsi Prabhala
SELECT aa.product_id, aa.product_name, aa.product_color
FROM products AS aa
INNER JOIN shops_products AS bb
ON aa.product_id = bb.procuct_id
WHERE bb.shop_id = 3;
0