MySQL如何正确获取包含NULL id_user的表中所有记录
问题分析与解决方案
你的问题出在使用了交叉连接(逗号连接表),这会导致当incident.id_user为NULL时,查询结果出现大量重复数据。具体来说,当incident.id_user is null这个条件成立时,数据库会把users表的每一行都和这条incident记录进行匹配,最终输出的结果会包含多条重复的number值,这显然不是你想要的。
要实现“获取所有包含有效id_user和id_user为NULL的incident记录”的需求,你需要用左外连接(LEFT JOIN),它会保留左表(incident)的所有记录,无论是否能在右表(users)中找到匹配的关联项。
正确的查询语句
SELECT incident.number FROM incident LEFT JOIN users ON incident.id_user = users.id;
为什么这个写法正确?
- LEFT JOIN 会返回
incident表的全部记录:对于id_user不为NULL的记录,会匹配对应的users行;对于id_user为NULL的记录,users表的关联字段会显示为NULL,但这条incident记录依然会被保留。 - 不会产生笛卡尔积导致的重复数据,每一条
incident记录只会在结果中出现一次。
如果你的需求只是单纯获取incident表中所有的number(不管是否关联用户),甚至可以简化为:
SELECT number FROM incident;
但如果后续需要关联users表的其他字段(比如用户名),LEFT JOIN的写法会更灵活,能直接扩展查询字段。
内容的提问来源于stack exchange,提问作者flamixx
相关产品推荐
相关产品推荐

