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

MySQL:如何为玩家未参与的GP设置默认值并计算总计时

解决方案

要实现为未参与的GP添加默认计时值99,你需要先构建玩家与目标GP的全量组合,再通过左连接关联记录,最后替换空值并求和。具体步骤如下:

核心思路

  • 先筛选出至少参与过目标GP(id=1,2,3)的玩家,再将这些玩家与目标GP做交叉连接,得到每个玩家对应每个目标GP的行(即使玩家没参与该GP)。
  • 左连接records表,匹配玩家和GP的关联记录,未参与的GP对应的time会是NULL。
  • 用IFNULL()函数将NULL的time替换为默认值99,最后按玩家分组求和。

完整SQL语句

SELECT 
    p.name,
    SUM(IFNULL(r.time, 99)) AS total_time
FROM 
    -- 筛选至少参与过目标GP的玩家
    (SELECT DISTINCT player_id FROM records WHERE gp_id IN (1,2,3)) AS eligible_players
    -- 交叉连接目标GP,生成玩家与GP的全量组合
    CROSS JOIN (SELECT id FROM gp WHERE id IN (1,2,3)) AS target_gps
    -- 关联玩家表获取名字
    JOIN player p ON eligible_players.player_id = p.id
    -- 左连接记录,保留所有组合,未参与的GP返回NULL
    LEFT JOIN records r ON eligible_players.player_id = r.player_id AND target_gps.id = r.gp_id
GROUP BY 
    p.id, p.name;

执行结果

执行后会得到符合预期的结果:

name    | total_time
--------|-----------
Thibaut | 99
Fred    | 95
Samir   | 162

关键说明

  • CROSS JOIN用于生成玩家和目标GP的所有可能组合,确保每个玩家的每个目标GP都有一行数据。
  • LEFT JOIN保证即使玩家没有该GP的记录,也能保留该行,此时r.time为NULL。
  • IFNULL(r.time, 99)将空值替换为默认计时99,再求和即可得到包含默认值的总计时。

内容的提问来源于stack exchange,提问作者Fizik26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:20:26