Mysql SQL左连接和WHERE产生意外结果
我有两个表,它们由一个名为“status”的字段关联。表2.location的值为“texas”,表2.status的20个实例的值为“good” 也就是说,下面的查询返回20行table2.status='good'Mysql SQL左连接和WHERE产生意外结果,mysql,sql,Mysql,Sql,我有两个表,它们由一个名为“status”的字段关联。表2.location的值为“texas”,表2.status的20个实例的值为“good” 也就是说,下面的查询返回20行table2.status='good' [A] SELECT table2.status FROM table2 WHERE table2.location = 'texas'; 此外,还有50个唯一的table1.id,table1.status='good' [A] SELECT table2.status FR
[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';
此外,还有50个唯一的table1.id,table1.status='good'
[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';
也就是说,下面的查询返回50行惟一的table1.id
[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]有问题
谢谢 如果要获取50个项目,则您的查询是错误的:您正在执行交叉联接50x20,因此您有1000条记录。
您不能按状态加入(这不是唯一的):可能是您的表设计错误。
在我看来,您应该在两个表中都有id并与其联接…如果您想得到50个项目,您的查询是错误的:您正在执行交叉联接50x20,因此您有1000条记录。
您不能按状态加入(这不是唯一的):可能是您的表设计错误。
在我看来,您应该在两个表中都有id,并与之联接…这是应该的。表1中的第一行与表2中的50行匹配,表1中的第二行与表2中的50行再次匹配,以此类推。。表1中的第一行匹配表2中的50行,表1中的第二行再次匹配表2中相同的50行,以此类推。您的查询有两个问题
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";
现在你的下一个问题是,地位不太可能是你真正想要加入的东西。为了帮助您获得想要的结果,我们需要查看两个表的表结构 您的查询有两个问题
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";
现在你的下一个问题是,地位不太可能是你真正想要加入的东西。为了帮助您获得想要的结果,我们需要查看两个表的表结构