MySQL LEFT JOIN与WHERE子句问题:查询指定玩家的所有赛事得分
解决LEFT JOIN只返回匹配行的问题
你猜的没错!问题确实出在WHERE子句上,我来给你捋清楚怎么调整:
首先,你遇到的核心问题是过滤时机不对:当你用LEFT JOIN时,events表的所有行本来都会被保留,但把results.playerID=1放在WHERE子句里后,那些没有匹配到该玩家的行中,results.playerID的值是NULL,而NULL=1的判断不成立,这些行就被直接过滤掉了,所以最终只返回了有得分的赛事。
正确的做法是把玩家ID的条件移到LEFT JOIN的ON子句中,这样在关联阶段就只匹配该玩家的结果,而不是关联完成后再过滤。具体SQL语句如下:
SELECT events.eventID, results.totalScore FROM events LEFT OUTER JOIN results ON events.eventID = results.eventID AND results.playerID = 1;
为什么这么改?
- 当条件写在ON子句时,LEFT JOIN会先根据
eventID关联两张表,同时只保留results表中playerID=1的行;对于没有匹配到该玩家的events行,results的字段会自动填充为NULL,不会被剔除。 - 而如果条件写在WHERE子句,是在关联完成后再做过滤,此时无匹配行的
results.playerID是NULL,不满足=1的条件,就被过滤掉了。
执行这条语句后,玩家1的查询结果就完全符合你的需求:
| eventID | totalScore |
|---|---|
| 1 | 34 |
| 2 | NULL |
| 3 | 36 |
另外,你原来的SELECT语句里包含了results.playerID,其实没必要保留——因为我们已经限定了只查询玩家1的结果,无匹配行里这个字段也是NULL,对结果展示没有帮助。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

