私には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_id
とproduct_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にあります、助けてくれてありがとう、本当に感謝しています。
私は外側から始めて中に入るのが好きです。したがって、すべての列が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
あなたはこれを試すことができます。
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
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;