Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL左连接和WHERE产生意外结果_Mysql_Sql - Fatal编程技术网

Mysql SQL左连接和WHERE产生意外结果

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

我有两个表,它们由一个名为“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 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";
现在你的下一个问题是,地位不太可能是你真正想要加入的东西。为了帮助您获得想要的结果,我们需要查看两个表的表结构