SQL统计帖子评论数时COUNT子查询为何返回0而非NULL
关于SQL解法中COUNT返回0而非NULL的原因说明
你疑惑的核心是混淆了COUNT两种完全不同的运行场景:
- 场景1:COUNT统计的结果集存在行,但某行的统计字段为NULL:此时
COUNT(列名)会跳过该NULL行,不会计入统计结果 - 场景2:COUNT统计的结果集本身是空集,没有任何匹配的行:此时不管COUNT的参数是什么,都会直接返回0,而不是NULL
你给出的解法刚好属于第二种场景,拿示例里的post_id=12举例:
当外层查询取到去重后的帖子id=12时,子查询执行SELECT COUNT(DISTINCT(t.sub_id)) FROM submissions t WHERE t.parent_id = 12,整个表没有任何一行的parent_id等于12,子查询的结果集是空的,COUNT统计空集的数量自然返回0,也就不需要额外用IFNULL/COALESCE函数处理NULL的情况。
补充验证方法
你可以自己做个简单测试就懂了:
- 执行
SELECT COUNT(sub_id) FROM submissions WHERE parent_id=999(随便写一个不存在的parent_id),返回结果就是0 - 去掉COUNT直接执行
SELECT sub_id FROM submissions WHERE parent_id=999,返回的是空结果集,此时如果把这个作为子查询嵌入SELECT字段,返回的才是NULL
解法其他逻辑说明
这个解法的其他设计也刚好匹配题目要求:
- 外层查询加
DISTINCT(s.sub_id):处理Submissions表无主键、帖子行重复的问题,拿到所有唯一的帖子id - 子查询加
DISTINCT(t.sub_id):处理评论行重复的问题,统计每篇帖子的唯一评论数 - parent_id对应不存在的帖子的评论(比如示例里parent_id=7的评论6):因为外层查询只筛选了存在的帖子id,所以这些无效评论自然不会被统计到结果里
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

