如何用MySQL实现各玩家最后5条记录的分数总和(无需手动传参)
计算每个玩家最近5条记录的分数总和(MySQL实现)
嘿,我明白你的需求了——原来的查询得手动指定player_id才能算单个玩家最近5条的总分,现在要改成自动对所有玩家完成这个计算对吧?下面给你两种可行的MySQL实现方式,适配不同版本:
方法1:用窗口函数(MySQL 8.0及以上版本推荐)
窗口函数是MySQL 8.0新增的特性,写起来简洁又直观:
SELECT player_id, SUM(score) AS total_last_5_scores FROM ( SELECT player_id, score, -- 按玩家分组,每组内按记录ID倒序分配行号 ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY id DESC) AS rn FROM performance_buzz ) AS ranked_records -- 只保留每个玩家的前5条最新记录 WHERE rn <= 5 GROUP BY player_id;
逻辑说明:
- 内层子查询给每个玩家的记录按
id倒序排号(最新的记录行号为1) - 外层筛选出行号≤5的记录,再按玩家分组求和,就能得到每个玩家最近5条的分数总和
方法2:关联子查询(兼容MySQL 5.x版本)
如果你的MySQL版本还不支持窗口函数,可以用自关联子查询的方式实现:
SELECT p1.player_id, SUM(p1.score) AS total_last_5_scores FROM performance_buzz p1 JOIN ( -- 子查询找出每个玩家的最近5条记录的ID SELECT id FROM performance_buzz p2 WHERE p2.player_id = p1.player_id ORDER BY p2.id DESC LIMIT 5 ) AS recent_ids ON p1.id = recent_ids.id GROUP BY p1.player_id;
逻辑说明:
- 对每条记录
p1,通过关联子查询找出同玩家下最新的5条记录ID - 只保留这些ID对应的记录,最后按玩家分组求和得到结果
另外,你提供的那个查询是用来找出每个name对应的最后一条记录的,它用自连接+WHERE m2.id IS NULL的方式找分组内最大ID的记录,但这种方式不太容易扩展到取前N条,所以上面两种方法更贴合你的需求。
内容的提问来源于stack exchange,提问作者pravin dabhi
相关产品推荐
相关产品推荐

