web-dev-qa-db-ja.com

多対多の関係を持つジャンクションテーブルでのSQL結合

私には3つのテーブルがあり、そのうち2つは通常のデータテーブルで、1つは多対多のジャンクションテーブルです。

2つのデータテーブル:

table products

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

そして

table shops

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

shop_idproduct_idを含むジャンクションテーブルがあります。

table shops_products

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

Shop_id 3を使用してショップにある製品からデータを選択したい。ここから、結合、左結合、内部結合を使用して多くの例を試しましたが、ここで何をしているのか、何がうまくいかないのかわかりません。私が持っていたクエリですが、指定されたショップにあるかどうかに関係なく、すべての製品が返されました。

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

期待される出力は次のとおりです。

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

これはMySQLにあります、助けてくれてありがとう、本当に感謝しています。

11
B_s

私は外側から始めて中に入るのが好きです。したがって、すべての列が1つのテーブルにまとめられていると想像してください。次のように書くことができます。

SELECT *
FROM products
WHERE shop_id = 3

次に、このステートメントを可能にするために結合を追加する必要があります。次に結合テーブルを追加する必要があることはわかっています(product_idが含まれているためにproductsテーブルに直接結合するためです)。そのため、次に進むのはその結合です。

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

実際、ここで停止できます...なぜならshop_idはすでに結合テーブルに存在します。ただし、最後の列のセットにショップの場所も必要な場合は、ショップとテーブルの結合を追加します。

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
40
Taryn East

あなたはこれを試すことができます。

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