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;
返回不同的结果!
有人可以解释这种行为吗?
谢谢
答案1
如果您使用 检查执行计划,EXPLAIN
您将看到第一个查询有Impossible WHERE noticed after reading const tables
。就是这样 - mysql 首先执行 JOIN,然后过滤结果。由于没有连接输出行与您的过滤器匹配,因此您得到的最终结果是空的。
第二个查询执行 OUTER JOIN,其条件始终为假,对uClassId
和返回 NULL uUserId
,但由于没有连接后过滤,因此您得到结果。