2015-10-28 9 views
5

Mam trzy tabele, z których 2 to zwykłe tabele danych, a 1 to wiele do wielu tabel skrzyżowań.Łączenie SQL na stole skrzyżowań z wieloma do wielu relacji

Tabele dwóch danych:

table products 

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

i

table shops 

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

Mam tabeli połączeniową, która zawiera tych i product_id 's shop_id:

table shops_products 

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

chcę wybierz dane z produktów, które są w sklepie z shop_id 3. Próbowałem wielu przykładów Jestem tutaj z połączeniami, lewymi złączami, wewnętrznymi złączami, ale po prostu nie wiem, co tu robię i co jest nie tak. Zapytanie miałem, ale właśnie wrócił wszystkie produkty niezależnie od tego czy są one w określonym sklepie jest następujący:

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 

oczekiwany wynik jest następujący:

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

Jest w MySQL, dziękuję dla jakiejkolwiek pomocy, naprawdę to doceniam.

Odpowiedz

15

Chciałbym zacząć od zewnątrz i poruszać się w więc wyobrazić wszystkie kolumny były zacięte razem tylko w jednej tabeli, można napisać coś takiego:.

SELECT * 
FROM products 
WHERE shop_id = 3 

Ty następnie wystarczy dodać sprzężenia, aby ta instrukcja była możliwa. Wiemy, że musimy dodać następną tabelę sprzężenia (ponieważ jest to ta, która bezpośrednio łączy się z tabelą produktów, ponieważ zawiera w niej product_id). Więc dołączenie jest następstwem:

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

i tak naprawdę możesz zatrzymać się tutaj ... ponieważ shop_id istnieje już na stole sprzężenia. Ale powiedzmy, że chciałaś również nazwę sklepu w zestawie ostatecznych kolumn, a następnie dodać sprzężenie ze stołem sklepowym.

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 
+1

Co za miła odpowiedź! –

+0

Dziękujemy! To rozwiązało mój problem i pomogło mi zrozumieć rozwiązanie. Jeszcze raz dziękuję, przyjmuję to za 5 minut, kiedy mi pozwoli :) –

1

Możesz spróbować tego.

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 
0
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;