SQL LEFT JOIN和WHERE会产生意外结果

时间:2012-02-15 19:40:09

标签: mysql sql

我有一个名为'status'的字段相关的两个表。如果table2.location的值为'texas',则有20个table2.status实例的值为'good'。

也就是说,以下查询返回20行table2.status ='good'。

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';

此外,还有50个唯一的table1.id,其中table1.status ='good'。

也就是说,以下查询返回50行唯一table1.id's。

[B] SELECT table1.id FROM table1 WHERE table1.status = 'good';

现在,当我运行以下查询时:

[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas";

我希望它能返回50行唯一ID。但是,实际上它返回50行唯一id的20次(即我返回了1000行)。

我做的快速修复是简单地执行SELECT DISTINCT table1.id ...然后只返回一组50行(而不是20行50行)。

但是,我想知道为什么我会看到这种行为 - 我的查询可能有问题[C]?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您想获得50个项目,那么您的查询是错误的:您正在执行50x20的交叉加入,因此您有1000条记录。
你不能加入状态(这不是唯一的):可能你的桌面设计是错误的 IMO你应该在两个表中都有id并加入它......

答案 1 :(得分:2)

预计。表1的第1行与表2的50行匹配,表1的第2行再次匹配表2等的50行。

答案 2 :(得分:1)

您的查询有两个问题

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas";

首先当你使用左连接时,第二个表上的条件必须是ON子句而不是where子句,或者你将左连接转换为内连接(因为必须满足条件)

因此,您的查询应该如下所示:

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas";

现在你的下一个问题是状态不太可能是你真正想要加入的东西。为了帮助您获得所需的结果,我们需要查看两个表的表结构。