我们给出了3个表:
T1: T2: T3:id | t3_id id | name id | t2_id---------- --------- ----------1 | 2 1 | abc 1 | 12 | NULL 2 | 123 2 | 13 | 1 3 | ab1 3 | 34 | 4 4 | 32b 4 | 2
现在我们测试了以下JOIN:
1:
SELECT *FROM T1INNER JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'
这个案子很清楚.结果:
T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123
2:
SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idLEFT JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'
这一点也很清楚:
T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc2 | NULL | NULL | NULL | NULL | NULL3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123
3:
SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'
这个有点奇怪.结果(与第一个相同):
T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123
我不明白MySQL如何评估这个表达式.为什么它忽略LEFT JOIN并且似乎更喜欢INNER JOIN.
如果我读这个查询就像:
>从T1获取数据>通过LEFT JOIN从T2获取数据(表示:仅在可能的情况下,否则采用NULL数据)>通过INNER JOIN从T3获取数据(意味着:删除所有无法通过此INNER JOIN连接的T2数据)
但似乎我必须向后阅读查询?!
有人可以向我解释这个场景吗?
解决方法:
左连接类似于“OR”,INNER JOIN类似于“AND”.所以有这样的优先权
t1 left join (t2 inner join t3)
这与…有很大的不同
(t1 left join t2) inner join t2