MySQL分组统计:查询用户旗下所有帖子的总评论数
解决方法:计算每个用户收到的总评论数
嘿,这个需求很常见,咱们可以通过关联查询加聚合函数轻松搞定。先理清楚表之间的关联关系:posts的author关联users的username,comments的postId关联posts的postId,核心就是把这些关联串起来,再按用户聚合统计。
方法1:分步统计(更直观)
先统计每个帖子的评论数,再基于这个结果汇总每个用户的总评论数:
第一步:统计单帖评论数
SELECT p.postId, p.author, COUNT(c.commentId) AS comment_count FROM posts p LEFT JOIN comments c ON p.postId = c.postId GROUP BY p.postId, p.author;
这里用LEFT JOIN是为了保留那些没有任何评论的帖子,这类帖子的comment_count会显示为0;如果用INNER JOIN就会直接过滤掉无评论的帖子,不符合统计完整性要求。
第二步:汇总用户总评论数
把上面的查询作为子查询,按author分组求和:
SELECT author, SUM(comment_count) AS total_received_comments FROM ( SELECT p.postId, p.author, COUNT(c.commentId) AS comment_count FROM posts p LEFT JOIN comments c ON p.postId = c.postId GROUP BY p.postId, p.author ) AS post_comment_summary GROUP BY author;
方法2:一步到位(更简洁)
直接通过三次表关联,一次聚合得到结果:
SELECT u.username, COUNT(c.commentId) AS total_received_comments FROM users u LEFT JOIN posts p ON u.username = p.author LEFT JOIN comments c ON p.postId = c.postId GROUP BY u.username;
- 这里用
LEFT JOIN users是为了包含那些从未发过帖子的用户,他们的total_received_comments会显示为0;如果只需要统计有发帖记录的用户,把第一个LEFT JOIN换成INNER JOIN即可。 - 注意用
COUNT(c.commentId)而不是COUNT(*):因为当帖子无评论时,c.commentId会是NULL,COUNT()会自动忽略NULL值,得到正确的0;而COUNT(*)会把NULL行也算入,导致统计结果错误。
内容的提问来源于stack exchange,提问作者Cameron Chong
相关产品推荐
相关产品推荐

