本文主要是介绍每日一题-65(锦标赛优胜者),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题65:
根据下表编写一个 SQL 查询来查找每组中的获胜者。获胜者的要求是在组内累积得分最高的选手。如果平局,player_id 最小 的选手获胜。
其中:
- Players表:player_id 是主键,该表的每一行表示每个玩家的组;
- Matches表:match_id 是的主键;每一行是一场比赛的记录,first_player 和 second_player 表示该场比赛的球员 ID;first_score 和 second_score 分别表示 first_player 和 second_player 的得分。
解题思路:
(1)每个选手的得分可能是 first_score 或者 second_score,因此需要用UNION ALL将 first_score和second_score连接起来,就可以得到每个人的总分
(2)得到每个用户的总分后,需要找到组内得分最高的选手。那么我们可以使用 ORDER BY,先根据得分倒序排列。如果平局,player_id 最小的选手获胜,那么只要再根据 player_id 正序排。
(3)最后只需要再使用一次 FROM 子句和 GROUP BY 取出每个组的第一条数据即可。(group 一组数据,如果没有选择取数规则,则取的是这组的第一数)
具体代码如下:
select group_id, player_id
from (select group_id,player_id,sum(score) scorefrom(-- 每个用户总的 first_scoreselect p.group_id,p.player_id,sum(m.first_score) scorefrom Players pjoin Matches m on p.player_id = m.first_playergroup by p.player_idunion all -- 每个用户总的 second_scoreselect p.group_id,p.player_id,sum(m.second_score) scorefrom Players pjoin Matches m on p.player_id = m.second_playergroup by p.player_id ) agroup by player_idorder by score desc ,player_id
) b
group by group_id;
这篇关于每日一题-65(锦标赛优胜者)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!