MySQL中如何统计发布最多首条评论的作者?
解决"哪些作者发布的首条评论最多?"的问题
首先得明确我们的核心目标:先精准定位每个帖子的第一条评论,再统计这些首评里各个作者的发布数量,最终找出首评数量最多的作者。
步骤1:正确获取每个帖子的首条评论
你之前提到的首评查询在MySQL严格模式下可能会有逻辑问题(author_id和comment既不在GROUP BY字段中,也不是聚合函数,结果可能不符合预期)。更稳妥的方式是用窗口函数ROW_NUMBER()来精准锁定每个帖子的第一条评论:
WITH first_comments AS ( SELECT post_id, author_id, comment, date, -- 按帖子分组,评论时间升序排序,标记第一条评论的行号为1 ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY date ASC) AS rn FROM comments ) SELECT post_id, author_id, comment, date AS comment_date FROM first_comments WHERE rn = 1;
这个CTE(公共表表达式)会给每个帖子下的评论按发布时间排序,只保留行号为1的那条,也就是真正的首评,能准确拿到对应作者的信息。
步骤2:统计首评数量最多的作者
基于上面的首评数据集,我们只需要按作者ID分组,统计每个作者的首评总数,再按数量降序排序即可:
WITH first_comments AS ( SELECT post_id, author_id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY date ASC) AS rn FROM comments ) SELECT author_id, COUNT(*) AS total_first_comments FROM first_comments WHERE rn = 1 GROUP BY author_id ORDER BY total_first_comments DESC;
如果你的MySQL版本低于8.0(不支持CTE),可以用子查询替代:
SELECT author_id, COUNT(*) AS total_first_comments FROM ( SELECT post_id, author_id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY date ASC) AS rn FROM comments ) AS first_comments WHERE rn = 1 GROUP BY author_id ORDER BY total_first_comments DESC;
补充说明
- 如果有多个作者的首评数量相同且都是最大值,上述查询会把他们全部列出来,完全符合需求。
- 要是遇到同一帖子有多条评论在同一时间发布的情况,若需要保留所有同时间的首评,可以把
ROW_NUMBER()换成RANK(),这样同时间的评论都会被标记为行号1,统计时会纳入所有符合条件的首评。
内容的提问来源于stack exchange,提问作者user9219182
相关产品推荐
相关产品推荐

