首页 文章

多个INNER JOIN返回null

提问于
浏览
0

我正在努力加入3张 table .

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 回答

  • 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

  • 3

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

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

相关问题