SQL查询:如何获取每个userId对应最高votecount的记录?
解决分组后保留每个userId最高votecount记录的问题
原SQL语句的问题在于,GROUP BY userId时未对votecount做聚合处理,数据库会返回每组中默认排序下的第一条记录(而非votecount最大的那条),所以得不到预期结果。以下是两种可行的修正方案:
方案1:使用窗口函数(推荐,适用于MySQL 8+、PostgreSQL等支持窗口函数的数据库)
SELECT userId, votecount FROM ( SELECT userId, votecount, ROW_NUMBER() OVER (PARTITION BY userId ORDER BY votecount DESC) AS rn FROM `audio` ) t WHERE rn = 1 ORDER BY userId LIMIT 50;
逻辑说明:
- 用
PARTITION BY userId按用户分组,每组内按votecount降序排序 - 给每组内的行标记序号
rn,序号为1的就是该用户votecount最高的记录 - 外层查询筛选出
rn=1的行,即可得到预期结果
方案2:关联子查询(兼容旧版本MySQL)
SELECT a.userId, a.votecount FROM `audio` a INNER JOIN ( SELECT userId, MAX(votecount) AS max_vote FROM `audio` GROUP BY userId ) b ON a.userId = b.userId AND a.votecount = b.max_vote ORDER BY a.userId LIMIT 50;
逻辑说明:
- 子查询先统计每个
userId对应的最高votecount值 - 再通过
INNER JOIN关联原表,匹配出每个用户对应最高votecount的行 - 若同一用户存在多条votecount相同的最高记录,该方案会返回所有匹配行;如需仅保留一条,可添加
DISTINCT或结合排序调整
内容的提问来源于stack exchange,提问作者Curtis Crentsil
相关产品推荐
相关产品推荐

