2015-10-28 11 views
5

Ho tre tabelle, di cui 2 sono tabelle di dati regolari e 1 è una tabella di giunzione molti a molti.SQL join sulla tabella di congiunzione con molti a molti rapporti

Le tabelle di dati due:

table products 

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

e

table shops 

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

Ho una tabella di giunzione che contiene i shop_id 's e product_id' s:

table shops_products 

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

voglio seleziona i dati dai prodotti che sono in negozio con shop_id 3. Ho provato molti esempi per m qui con join, left join, inner join, ma non so cosa sto facendo qui e cosa sta andando male. La query che ho avuto, ma appena tornato tutti i prodotti, indipendentemente se sono nel negozio indicato è il seguente:

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 

Il risultato atteso è la seguente:

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

Questo è in MySQL, grazie per qualsiasi aiuto, lo apprezzo davvero.

risposta

15

Mi piace iniziare dall'esterno e si muovono in Quindi immaginate tutte le colonne erano tutti inceppati insieme in un solo tavolo, si potrebbe scrivere qualcosa di simile a:.

SELECT * 
FROM products 
WHERE shop_id = 3 

È quindi è sufficiente aggiungere i join per rendere possibile questa affermazione. Sappiamo che è necessario aggiungere la tabella di join successiva (poiché è quella che si aggiunge direttamente alla tabella dei prodotti perché contiene product_id). Quindi, che si uniscono è ciò che accade dopo:

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

e in realtà ci si può fermare proprio qui ... perché shop_id esiste sul tavolo join già. Ma diciamo che volevi anche il nome del negozio nel set di colonne finali, quindi aggiungi il join del tavolo dello shop.

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

Che bella risposta! –

+0

Grazie! Questo ha risolto il mio problema e mi ha aiutato a capire la soluzione. Grazie ancora, lo accetterò in 5 minuti quando mi permetterà :) –

1

Puoi provare questo.

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;