[英]SQL join on junction table with many to many relation
我有三个表,其中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,谢谢你的任何帮助,我真的很感激。
我喜欢从外面开始进入。所以想象所有的列都只是在一张桌子里塞在一起,你可以这样写:
SELECT *
FROM products
WHERE shop_id = 3
然后,您只需添加连接即可使此语句成为可能。 我们知道我们需要接下来添加连接表(因为它是直接连接到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
已经存在于连接表中。 但是,假设您还希望商店在最终列的集合中的位置,然后您将添加商店表连接。
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
你可以试试这个。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.