【问题标题】:MySQL LEFT JOIN with NULL [duplicate]MySQL LEFT JOIN with NULL [重复]
【发布时间】:2020-01-19 14:32:17
【问题描述】:

我有以下查询:

SELECT *
FROM work
LEFT JOIN users ON work.user_id = users.user_id
LEFT JOIN customer ON work.customer_id = customer.customer_id
WHERE customer.visible = 0 

问题在于“LEFT JOIN customer ON...”和 WHERE 条件“customer.visible = 0”。 我的表“work”中有条目,其中“customer_id = NULL”,它们被从选择中删除,因为客户表中显然没有 ID 为“NULL”的客户。

我想在我的工作表中保留“customer_id = NULL”的所有条目。

【问题讨论】:

  • 将此条件:customer.visible = 0 移至 ON 子句并删除 WHERE。
  • 解释:当没有匹配的customer 行时,将加入一个空的customer 行。该行中的所有customer 列均为空。它的visible 列为空,因此,不是 0。
  • 问题是当您加入并且客户 ID 为空时,该行中所有与客户相关的列都变为 NULL。这使得 customer.visibility = NULL 并且您的语句不起作用。
  • 永远不要使用SELECT *。始终命名并正确限定您实际希望返回的列
  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 OUTER JOIN ON 之后,需要右 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN 删除任何由 NULL 扩展的行,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。

标签: mysql join left-join


【解决方案1】:

这里最棘手的部分是,在左连接中使用 where 条件使其成为内连接。你可能需要 -

SELECT *
FROM work
LEFT JOIN users ON work.user_id = users.user_id
LEFT JOIN customer ON work.customer_id = customer.customer_id
                   AND customer.visible = 0

【讨论】:

  • SELECT * 在这种情况下很少有用
  • 我认为OP更关心解决他的问题而不是*
猜你喜欢
  • 2013-11-02
  • 2019-03-25
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多