令我惊讶的是,以下两个查询返回了不同的结果:
SELECT *
FROM foo
JOIN bar
ON bar.id=foo.bar_id
JOIN baz
ON baz.id=foo.baz_id
LEFT JOIN zig
ON zig.foo_id=foo.id;
和
SELECT *
FROM foo
LEFT JOIN zig
ON zig.foo_id=foo.id
JOIN bar
ON bar.id=foo.bar_id
JOIN baz
ON baz.id=foo.baz_id;
我想象你LEFT JOIN
zig
上的zig
无关紧要,因为我在加入bar
时没有使用baz
列JOIN
。但是,在后者中,bar
和baz
的{{1}}吞噬了zig
具有null
值的行...为什么那是吗?
答案 0 :(得分:3)
这很好用。我错了。
答案 1 :(得分:2)
这些是不同的,因为您的左连接在语句中的位置。请记住,联接不仅仅是您要比较字段的两个表,而是您加入到该点和下一个表的所有内容。
因此,在第一个语句中,您将在第一个联接中过滤掉foo中的行(那些没有bar_id = bar.id的行)
但是在第二个声明中,您将左边的连接包含在所有foo中。
当我开始写这篇文章时,这比我预想的更难表达,让我知道你是否有意义。