使用mySQL将3个表与1个查询

时间:2016-01-26 21:51:44

标签: php mysql join

在不同的情况下已经提出并回答了这个问题,但我所看到的并不能解决我的问题。

问题:我有3个表我需要同时从中提取数据来比较和检索信息。所有3个表格都包含一封电子邮件'柱。现在,来自table1的用户电子邮件可以在table2和table3中匹配相同用户的电子邮件,具体取决于用户的状态。或者来自table1的电子邮件将仅匹配table2或table3中的电子邮件,具体取决于用户的状态。例如,用户可能具有红色状态(用户将显示在表2中),蓝色状态(用户将显示在表3中)或两者,红色和蓝色(用户将同时显示在table2和table3中)。

需要什么:需要将table1中的电子邮件与table2和table3中的电子邮件进行比较,并返回给定用户的区域值,该值记录在table2和table3中,但不记录在table1中。我知道。令人愉快的数据架构!无论哪种方式,我都能够非常成功地JOIN table1到table2,但我不确定如何使用table3对JOIN进行打击。

这里是2个表的查询:

SELECT * FROM table1
INNER JOIN table2
ON table2.email = table1.email
WHERE month = 'numberHere' ORDER BY submitdate DESC

当我只是添加另一个INNER JOIN时,我的代码并没有按照说法中断,但它也没有给我任何行显示。因此,尽管网络上有许多工作示例,但下面的代码并不起作用:

SELECT * FROM table1
INNER JOIN table2
ON table2.email = table1.email
INNER JOIN table3
ON table3.email = table2.email
WHERE month = 'numberHere' ORDER BY submitdate DESC

2 个答案:

答案 0 :(得分:3)

您需要使用LEFT JOIN,这样即使其中一个表中没有匹配的行,连接也会成功。

SELECT * FROM table1
LEFT JOIN table2
    ON table2.email = table1.email
LEFT JOIN table3
    ON table3.email = table2.email
WHERE month = 'numberHere'
    AND (table2.email IS NOT NULL OR table3.email IS NOT NULL)
ORDER BY submitdate DESC

附加条件过滤掉任一表中没有匹配的行。

答案 1 :(得分:3)

要匹配table1在任何情况下的行和其他表的行,只有它们是,您必须使用LEFT JOIN,加入table2table3 table1(不是table2 table1table3 tabel2):

SELECT * FROM table1
LEFT JOIN table2
ON table2.email = table1.email
LEFT JOIN table3
ON table3.email = table1.email

通过这种方式,您可以从table1中选择值,即使其他表中没有匹配项也是如此。

详细了解SQL联接:Different SQL Joins