如何筛选参与全部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
相关产品推荐
相关产品推荐

