SQL join on junction table с отношением многие ко многим

у меня есть три таблицы, из которых 2 являются регулярными таблицами данных, а 1-много для многих таблиц соединений.

две таблицы данных:

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_ids:

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, спасибо за любую помощь, я очень ценю это.

3 ответов


мне нравится начинать снаружи и двигаться внутрь. Итак, представьте, что все столбцы были сжаты вместе в одной таблице, вы можете написать что-то вроде:

SELECT *
FROM products
WHERE shop_id = 3

вам просто нужно добавить соединения, чтобы сделать этот оператор возможным. Мы знаем, что нам нужно добавить таблицу join next (так как это тот, который присоединяется непосредственно к таблице products из-за того, что в нем есть product_id). Так что присоединяйтесь к тому, что будет дальше:

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

и на самом деле вы можете остановиться прямо здесь... потому что shop_id уже существует в таблице соединений. Но допустим, вам также нужно имя магазина в наборе конечных столбцов, затем вы добавите соединение shop-table.

SELECT products.*, shops.shop_name
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;