2015-10-28 65 views
5

我有三个表,其中2个是常规数据表,1个是多对多联结表。具有多对多关系的联结表上的SQL连接

两个数据表:

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的,谢谢任何帮助,我真的很感激它。

回答

15

我喜欢从外部开始在移动 所以,想象一下所有列在短短的一个表中所有被卡在一起,你可以写这样的:。

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_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

真是个好的答案! –

+0

谢谢!这解决了我的问题,并帮助我理解解决方案。再次感谢,我会在5分钟内接受它,当它让我:) –

1

你可以试试这个。

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; 
相关问题