You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:19:23