以下两个查询不会返回相同的结果。为什么?
注意:我发现这个问题是一个Mysql难题,我没有关于这个问题的更多数据?
SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id
AND table2.val < 5
SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id
WHERE table2.val < 5
答案 0 :(得分:4)
如果不满足条件,左外连接将返回行(如果选择了table2,则返回table2中的空列),而WHERE会过滤掉它们。
答案 1 :(得分:3)
第一个查询将返回表1中的所有行。无论你在连接条件中写什么,LEFT JOIN总是返回左表中的所有行(如果有多个匹配,它可以复制行,但是因为你是加入一个名为id
的字段,它很可能是一个唯一的密钥,因此不会有重复项。)
第二个查询只返回表1中的那些行其中 table2中的相应行有val < 5
。实际上,您可以在此处编写INNER JOIN
而不是LEFT JOIN
,因为由于WHERE
子句,连接失败的行无论如何都不会出现在结果集中。
答案 2 :(得分:1)
第一个查询仅在table2.val < 5
加入。第二个过滤甚至table1行。如果您使用INNER JOIN,则应给出相同的结果。
答案 3 :(得分:0)
尝试将“编译器”视为查看括号 ...
SELECT table1.*
FROM table1
LEFT JOIN table2 ON (
table2.table1_id = table1.id
AND table2.val < 5
)
当条件table2.table1_id = table1.id AND table2.val < 5
为真时,此示例执行2个表的LEFT JOIN。
SELECT table1.*
FROM table1
LEFT JOIN table2 ON ( table2.table1_id = table1.id )
WHERE (table2.val < 5)
此示例在条件table2.table1_id = table1.id
适用时执行LEFT JOIN,然后获取结果table1 LEFT JOIN table2 ON ( table2.table1_id = table1.id )
WHERE条件table2.val < 5
为真的行