求SQL:获取usertable全量用户及match 869的nd_abletoplay状态
解决LEFT JOIN后无法返回全量用户的SQL问题
你的问题出在WHERE条件的位置:原SQL里把赛事过滤条件放在WHERE子句中,会过滤掉那些在namedown表中有其他赛事记录(但没参与869赛事)的用户——因为这些用户的nd.nd_matchuid既不是869,也不是NULL,不符合WHERE的判断逻辑,导致丢失了部分usertable的记录。
正确写法一:把赛事条件移到JOIN的ON子句中
将nd.nd_matchuid = 869放到LEFT JOIN的关联条件里,这样只会关联869赛事的记录,不匹配的用户对应的nd_AbleToPlay自然会返回NULL,同时保留usertable的所有行:
SELECT ut.usr_uid, CONCAT(ut.usr_firstname, ' ', ut.usr_lastname) AS Name, nd.nd_AbleToPlay FROM usertable AS ut LEFT JOIN namedown AS nd ON ut.usr_uid = nd.nd_playeruid AND nd.nd_matchuid = 869
正确写法二:用子查询预筛选赛事记录
先从namedown中只取出869赛事的数据,再和usertable做LEFT JOIN,效果和上面一致:
SELECT ut.usr_uid, CONCAT(ut.usr_firstname, ' ', ut.usr_lastname) AS Name, nd.nd_AbleToPlay FROM usertable AS ut LEFT JOIN (SELECT nd_playeruid, nd_AbleToPlay FROM namedown WHERE nd_matchuid = 869) AS nd ON ut.usr_uid = nd.nd_playeruid
这两种写法都能返回你期望的结果:参与869赛事的用户显示对应状态,未参与的显示NULL,同时保留usertable的全部用户。
内容的提问来源于stack exchange,提问作者Grant A Granta
相关产品推荐
相关产品推荐

