【问题标题】:Multiple INNER JOIN returns null多个 INNER JOIN 返回 null
【发布时间】:2012-08-10 04:03:38
【问题描述】:

我正在加入 3 个表格。

table1.
grp_id | email_id
   1   |  3 
   1   |  58

table2.
sam_msg_id | sam_subject
   3       |  Funnel

table3.
id | subject
58 | testing check


Desired Output:

id |grp_id|email_id|sam_subject|subject      |
184|1     |3       |funnel     |             |
185|1     |58      |           |testing check|

我尝试的查询:

SELECT table1.*, table2.sam_subject, table3.* 
FROM table1
INNER JOIN table2 
    ON table2.sam_msg_id = table1.email_id 
INNER JOIN table3 
    ON table3.id = table1.email_id 
WHERE table1.grp_id = '1' 

我在这里要做的是从 table2 和 table3 中获取主题列表及其 id,其中 id 位于 email_id 下的 table1 中。

当我尝试仅通过仅检查 table2 中的数据来使用一个内部联接进行此操作时,它正在工作。

我不熟悉使用内部连接,因此我看不出我做错了什么。

我正在使用 MySQL。

【问题讨论】:

  • table3中是否真的有匹配的相关行?如果不是,这应该是 table1 和 table3 之间的LEFT JOIN
  • 您可能想将INNER JOIN 更改为LEFT JOIN
  • 你可能想使用LEFT JOIN
  • table1 和 2 与 table1 和 3 之间存在匹配行

标签: mysql sql


【解决方案1】:

听起来你需要LEFT JOIN

SELECT table1.*, table2.sam_subject, table3.* 
FROM table1
LEFT JOIN table2 
    ON table2.sam_msg_id = table1.email_id 
LEFT JOIN table3 
    ON table3.id = table1.email_id 
WHERE table1.grp_id = '1' 

根据您的编辑,以下内容应为您提供所需的结果:

SELECT t1.grp_id, 
  t1.email_id, 
  coalesce(t2.sam_subject, '') sam_subject, 
  coalesce(t3.subject, '') subject
FROM t1
left JOIN t2 
    ON t2.sam_msg_id = t1.email_id 
left JOIN t3 
    ON t1.email_id = t3.id
WHERE t1.grp_id = '1' 

SQL Fiddle with Demo

【讨论】:

  • 感谢这位朋友。你能总结一下它是如何工作的吗?谢谢。 :)
  • 最好的解释来自Visual Explanation of JOINs。您加入了 INNER,这需要所有 3 个表中的匹配行。您有单独的匹配行,因此您需要 LEFT JOIN 来返回结果。
【解决方案2】:

我对你在问什么有点困惑。如果您可以提供当前数据和所需输出的示例,我们可能会确定一个解决方案。

事实上,我怀疑您需要阅读LEFT JOIN,如果您的子表中没有匹配的记录,它将返回NULL。如果没有匹配,INNER JOIN 将不会返回记录。

查看这篇文章,了解不同类型的连接:

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

更新:

我不确定您想要的结果的第一列来自哪里,但下面的查询应该会为您提供想要的结果:

SELECT t1.*, t2.sam_subject, t3.subject
FROM Table1 as t1
LEFT JOIN table2 as t2
on t1.email_id = t2.sam_msg_id
LEFT JOIN table3 as t3
on t1.email_id = t3.id

【讨论】:

  • 你能添加你想要的输出吗?
  • 更新了我的答案。当没有对应的值时,这将返回null。如果您想将其更改为空字符串或其他内容,可以将COALESCE 扔在那里。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 2015-01-13
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-05-13
相关资源
最近更新 更多