SQL连接在连接表上有多对多的关系

B_s*_*B_s 11 mysql sql join junction-table

我有三个表,其中2个是常规数据表,1个是多对多联结表.

两个数据表:

table products

product_id | product_name | product_color
-----------------------------------------
1          | Pear         | Green
2          | Apple        | Red
3          | Banana       | Yellow
Run Code Online (Sandbox Code Playgroud)

table shops

shop_id    | shop_location
--------------------------
1          | Foo street
2          | Bar alley
3          | Fitz lane
Run Code Online (Sandbox Code Playgroud)

我有一个包含shop_id's和product_id's 的联结表:

table shops_products

shop_id    | product_id
--------------------
1          | 1
1          | 2
2          | 1
2          | 2
2          | 3
3          | 2
3          | 3
Run Code Online (Sandbox Code Playgroud)

我想从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
Run Code Online (Sandbox Code Playgroud)

预期的输出如下:

product_name | product_color
----------------------------
Apple        | Red
Banana       | Yellow
Run Code Online (Sandbox Code Playgroud)

这是在MySQL,谢谢你的任何帮助,我真的很感激.

Tar*_*ast 38

我喜欢从外面开始进入.所以想象所有的列都只是在一张桌子里塞在一起,你可以这样写:

SELECT *
FROM products
WHERE shop_id = 3
Run Code Online (Sandbox Code Playgroud)

然后,您只需添加连接即可使此语句成为可能.我们知道我们需要接下来添加连接表(因为它是直接连接到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
Run Code Online (Sandbox Code Playgroud)

实际上你可以在这里停止...因为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
Run Code Online (Sandbox Code Playgroud)

  • 真是个好消息! (4认同)
  • 谢谢!这解决了我的问题,并帮助我理解了解决方案。再次感谢,当它让我时,我会在 5 分钟内接受它:) (3认同)
  • 正确答案 。只需编辑您的第二个查询,即可将shops.shop_location替换为shops.shop_location,因为OP的表“ shops”中没有shop_name这样的列。 (2认同)