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_id
s:
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;