如何为每个用户选取单条最高点赞数的帖子记录
解决方案
你的现有SQL语句会返回每个用户所有点赞数达到最大值的记录(比如用户t16的两条记录都会被选中),但需求要求同一用户仅保留一条最高点赞记录,以下是几种可行的改进方法:
方法1:窗口函数ROW_NUMBER()(推荐)
这是最通用的方案,支持MySQL 8.0+、PostgreSQL、SQL Server等绝大多数现代数据库:
SELECT npost_id, mid, like_count FROM ( SELECT npost_id, mid, like_count, -- 按用户分组,先按点赞数降序,再按npost_id升序(确保同点赞数时取最小主键的记录) ROW_NUMBER() OVER (PARTITION BY mid ORDER BY like_count DESC, npost_id ASC) AS row_num FROM feed ) ranked_feed WHERE row_num = 1;
如果需要取同点赞数中npost_id最大的记录,把npost_id ASC改成npost_id DESC即可。
方法2:关联子查询(兼容旧版数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用子查询匹配每个用户的目标记录:
SELECT f.npost_id, f.mid, f.like_count FROM feed f WHERE f.npost_id = ( SELECT sub.npost_id FROM feed sub WHERE sub.mid = f.mid ORDER BY sub.like_count DESC, sub.npost_id ASC LIMIT 1 );
方法3:GROUP BY结合聚合函数(简单场景)
如果业务上可以接受用npost_id的最大/最小值来筛选同点赞数的记录,也可以直接分组聚合:
SELECT MIN(npost_id) AS npost_id, -- 替换成MAX则取最大主键的记录 mid, MAX(like_count) AS like_count FROM feed GROUP BY mid;
内容的提问来源于stack exchange,提问作者Z N
相关产品推荐
相关产品推荐

