【问题标题】:SQL Outer join 2 tablesSQL 外连接 2 个表
【发布时间】:2026-01-15 03:20:06
【问题描述】:

我有两张桌子,comp_productcomp_product_marchand

comp_product 包含产品信息(描述、名称等)

comp_product_marchand 包含不同的价格(产品经销商)。每个经销商都有一个产品的价格。但并非适用于所有产品

我只想为每个经销商获取一个 SQL 查询产品列表和他的价格(即使经销商没有)

我有这个 SQL 查询:

SELECT
    p.id_product,
    pm.price
FROM comp_product_marchand pm
LEFT OUTER JOIN comp_product p
    ON p.id_product = pm.id_product
WHERE id_marchand = 4

(WHERE 子句仅用于演示)

此 SQL 查询返回有价格的产品的价格,而不是其他产品的价格... 有什么想法吗?

【问题讨论】:

标签: mysql sql


【解决方案1】:

更改表格之间的链接:

SELECT
    p.id_product,
    pm.price
FROM comp_product p
LEFT OUTER JOIN comp_product_marchand pm
    ON p.id_product = pm.id_product
    AND id_marchand = 4

通过这种方式,您将显示所有产品,如果 marchand = 4 有一个,则将显示有关 marchand 的信息。

我将查询放在了 ON 子句中的 marchand ID 上,因为如果你把它放在 WHERE 子句中,你将剪切掉没有该产品的 Marchand 的所有行

【讨论】:

  • @FabienPapet:祝你有美好的一天;)
  • +1 :这个答案还将查询的顺序从price LEFT JOIN product(如OP的帖子中)反转为product LEFT JOIN price,从而确保所有产品始终包含在JOIN的结果中.
  • @MatBailie:谢谢。祝你有美好的一天;)
【解决方案2】:

您需要更改联接的操作方式。您可以使用当前查询并使用RIGHTjoin,或者我更喜欢的方式是切换表的顺序(仍然使用LEFT join),以便您希望查看所有结果的表位于连接的左侧。有时是一个困难的概念,但这张图可以提供帮助

切换加入代码: 选择 p.id_product, pm.price

    FROM comp_product p
               LEFT OUTER JOIN comp_product_marchand pm ON 
                               p.id_product=pm.id_product 
                               AND id_marchand=4 ;

【讨论】:

  • 您不能放入 WHERE 子句 id_marchand = 4 因为当 comp_product_marchand 以这种方式不存在时,您会剪切该行
  • 我以为这只是针对该商家的过滤?所以他的查询只返回一次商家的价格和产品。
  • 感谢您的帮助,您的图表对我有很大帮助! ;)
  • @Telexx:嗨,我们的 OP 想要那个 marchant 的所有产品,但是如果这个 marchant 没有产品,他想展示那个产品。
  • @Telexx:修正你的答案,+1 以获得详细的 JOIN 解释