不可预知的MySQL服务器行为左连接

CREATE TEMPORARY TABLE tmp_userid ( uUserId int unsigned NOT NULL PRIMARY KEY ) ENGINE='MEMORY'; CREATE TEMPORARY TABLE tmp_studentid ( uClassId INT UNSIGNED NOT NULL, uUserId int unsigned NOT NULL, PRIMARY KEY(uClassId,uUserId) ) ENGINE='MEMORY'; INSERT INTO tmp_userid values (18); INSERT INTO tmp_studentid values (1,1), (1,3), (2,15), (3,20), (3,25), (4,35), (4,45) ; 

现在,如果我尝试执行:

 SELECT * FROM tmp_userid U LEFT JOIN tmp_studentid S ON U.uUserId = S.uUserId where uClassId = 4; SELECT * FROM tmp_userid U LEFT JOIN tmp_studentid S ON U.uUserId = S.uUserId AND uClassId = 4; 

返回不同的结果!

任何人都可以解释这种行为?

谢谢

如果你用EXPLAIN检查执行计划,你会看到Impossible WHERE noticed after reading const tables ,第一个查询Impossible WHERE noticed after reading const tables 。 是这样的 – mysql会首先JOIN,然后过滤结果。 由于没有连接输出行匹配你的filter,你会得到空的最终结果。

第二个查询做了一个OUTER JOIN,其条件总是为false,为uClassIduUserId返回NULL,但是由于没有post-join过滤,所以你会得到结果。