多个INNER JOIN返回null

时间:2012-08-13 21:25:51

标签: mysql sql

我正在努力加入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在email1id下的table1中找到。

当我尝试使用一个内连接时,只检查来自table2的数据,它正在工作。

我不熟悉使用内部连接因此我无法真正看到我做错了什么。

我正在使用MySQL。

2 个答案:

答案 0 :(得分:3)

听起来你需要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

答案 1 :(得分:1)

我对你的要求感到有点困惑。如果您可以提供当前数据和所需输出的示例,我们可以确定解决方案。

实际上,我怀疑你需要阅读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