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

如何筛选参与全部GP的玩家并计算其总时长?

筛选参与所有GP的玩家并计算总时长

需求说明

需要从三张表(gp、player、records)中,筛选出参与了全部GP赛事的玩家,并计算他们的总参赛时长。本例中仅Thibaut和Fred参与了全部3个GP,Samir仅参与2个,需要排除Samir。

原SQL问题

原SQL仅实现了按玩家分组求和,但无法过滤未参与全部GP的玩家:

SELECT p.name, sum(time) 
from records r 
join gp g on r.gp_id = g.id 
join player p on r.player_id = p.id
group by r.player_id

解决方案

通过HAVING子句结合统计玩家参与的GP数量,与总GP数对比,筛选出符合条件的玩家:

SELECT p.name, SUM(r.time) AS total_time
FROM records r
JOIN player p ON r.player_id = p.id
GROUP BY r.player_id, p.name
HAVING COUNT(DISTINCT r.gp_id) = (SELECT COUNT(*) FROM gp)

代码说明

  • COUNT(DISTINCT r.gp_id):统计每个玩家参与的不同GP赛事数量,避免同一GP存在多条记录时统计出错
  • (SELECT COUNT(*) FROM gp):获取数据库中所有GP赛事的总数量
  • HAVING子句:仅保留参与GP数量等于总GP数的玩家分组
  • 分组时同时包含p.name,是为了兼容部分SQL模式(要求SELECT中的非聚合字段必须出现在GROUP BY中)

注:原SQL中关联gp表的操作可以去掉,因为我们只需要统计玩家参与的GP数量,records表中的gp_id已经足够,去掉后能提升查询效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50