如何统计各帖子评论数(包含评论数为0的情况)
解决帖子评论数统计(含0评论情况)
嘿,我来帮你搞定这个问题~你现在的查询只返回有评论的帖子,核心原因是你从comments表入手的——没有评论的帖子根本不会出现在这个表里,自然查不到。要拿到评论数为0的结果,得换个思路,从posts表出发才行!
方案1:左连接(LEFT JOIN)实现
这是最常用的方式,通过左连接确保所有目标帖子都被包含,即使没有评论:
SELECT posts.id, COUNT(comments.id) AS comment_count FROM posts LEFT JOIN comments ON comments.post_id = posts.id WHERE posts.id IN (1, 2, 3, 4, 5) GROUP BY posts.id ORDER BY posts.created_at DESC, posts.id DESC;
关键细节解释:
- 从
posts表开始:确保你要统计的1-5号帖子都被纳入结果集,不管有没有评论。 - LEFT JOIN comments:保留
posts的所有记录,匹配comments中对应post_id的评论;如果没有评论,comments的字段会是NULL。 - COUNT(comments.id):
COUNT()会忽略NULL值,所以没有评论的帖子会得到0;如果用COUNT(*)的话,会把NULL的行也算进去,得到错误的1,一定要注意! - GROUP BY posts.id:按帖子ID分组,统计每个帖子的评论数。
- 排序逻辑:用
posts.created_at排序更合理,因为没有评论的帖子没有comments.created_at,用帖子自身的创建时间排序符合常规需求。
方案2:相关子查询实现
如果你更习惯子查询的写法,也可以用这种方式,逻辑更直观:
SELECT posts.id, (SELECT COUNT(id) FROM comments WHERE comments.post_id = posts.id) AS comment_count FROM posts WHERE posts.id IN (1, 2, 3, 4, 5) ORDER BY posts.created_at DESC, posts.id DESC;
这个语句会对每个帖子单独查询对应的评论数,没有评论时子查询返回0,同样能满足需求。
原查询的问题分析
你原来的语句有两个核心问题:
- 数据源选错了:从
comments表出发,天然排除了没有评论的帖子。 - GROUP BY字段错误:你写的
GROUP BY id是按评论ID分组,这完全不符合统计需求——应该按post_id分组,但即使改了,还是解决不了无评论帖子的问题,因为数据源还是comments表。
内容的提问来源于stack exchange,提问作者Cannon431
相关产品推荐
相关产品推荐

