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,为uClassId和uUserId返回NULL,但是由于没有post-join过滤,所以你会得到结果。