У меня есть три таблицы, из которых 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:

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

13
B_s 29 Окт 2015 в 02:43

3 ответа

Лучший ответ

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

SELECT *
FROM products
WHERE shop_id = 3

Затем вам просто нужно добавить объединения, чтобы сделать этот оператор возможным. Мы знаем, что нам нужно добавить следующую таблицу соединений (поскольку она присоединяется непосредственно к таблице продуктов, поскольку в ней есть 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 уже существует в таблице соединения. Но допустим, вы также хотите, чтобы местоположение магазина было в наборе последних столбцов, а затем вы добавили бы соединение «магазин-таблица».

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
41
Taryn East 15 Окт 2018 в 04:26
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
Kostas Mitsarakis 28 Окт 2015 в 23:46

Вы можете попробовать это.

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 28 Окт 2015 в 23:45