欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 力扣1212. 查询球队积分

力扣1212. 查询球队积分

2025/4/20 4:45:21 来源:https://blog.csdn.net/dhdbanwan/article/details/143180167  浏览:    关键词:力扣1212. 查询球队积分

一、数据

1212. 查询球队积分

表: Teams

+---------------+----------+
| Column Name   | Type     |
+---------------+----------+
| team_id       | int      |
| team_name     | varchar  |
+---------------+----------+
team_id 是该表具有唯一值的列。
表中的每一行都代表一支独立足球队。

表: Matches

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| match_id      | int     |
| host_team     | int     |
| guest_team    | int     | 
| host_goals    | int     |
| guest_goals   | int     |
+---------------+---------+
match_id 是该表具有唯一值的列。
表中的每一行都代表一场已结束的比赛。
比赛的主客队分别由它们自己的 id 表示,他们的进球由 host_goals 和 guest_goals 分别表示。

你希望在所有比赛之后计算所有球队的比分。积分奖励方式如下:

  • 如果球队赢了比赛(即比对手进更多的球),就得 3 分。
  • 如果双方打成平手(即,与对方得分相同),则得 1 分。
  • 如果球队输掉了比赛(例如,比对手少进球),就 不得分 。

编写解决方案,以找出每个队的 team_idteam_name 和 num_points

返回的结果根据 num_points 降序排序,如果有两队积分相同,那么这两队按 team_id  升序排序

返回结果格式如下。

示例 1:

输入:
Teams table:
+-----------+--------------+
| team_id   | team_name    |
+-----------+--------------+
| 10        | Leetcode FC  |
| 20        | NewYork FC   |
| 30        | Atlanta FC   |
| 40        | Chicago FC   |
| 50        | Toronto FC   |
+-----------+--------------+
Matches table:
+------------+--------------+---------------+-------------+--------------+
| match_id   | host_team    | guest_team    | host_goals  | guest_goals  |
+------------+--------------+---------------+-------------+--------------+
| 1          | 10           | 20            | 3           | 0            |
| 2          | 30           | 10            | 2           | 2            |
| 3          | 10           | 50            | 5           | 1            |
| 4          | 20           | 30            | 1           | 0            |
| 5          | 50           | 30            | 1           | 0            |
+------------+--------------+---------------+-------------+--------------+
输出:
+------------+--------------+---------------+
| team_id    | team_name    | num_points    |
+------------+--------------+---------------+
| 10         | Leetcode FC  | 7             |
| 20         | NewYork FC   | 3             |
| 50         | Toronto FC   | 3             |
| 30         | Atlanta FC   | 1             |
| 40         | Chicago FC   | 0             |
+------------+--------------+---------------+

二、分析

本题的主要难点是如何求出一场比赛中两个队伍的分别得分数,因此我们可以使用UNION ALL的办法进行解决,首先从Matches表中找出所有host_team,然后使用case when语句进行条件判断计算host_team的得分,然后再找出所有的guest_team,同理使用case when语句计算guest_team的得分,最后使用UNION ALL将其进行连接。然后将其作为一个临时表,对这些队伍的id进行分组,并与team表进行连接,求出每个队伍的得分。

三、代码

WITH tem AS (SELECT host_team id,  -- 找出host_team的得分CASEWHEN host_goals > guest_goals THEN 3WHEN host_goals < guest_goals THEN 0ELSE 1
end score
FROM matches
UNION ALL
SELECT guest_team id,     -- 找出guest_team的得分CASEWHEN host_goals < guest_goals THEN 3WHEN host_goals > guest_goals THEN 0ELSE 1
end score
FROM matches
)
SELECT team_id,team_name,ifnull(sum(score),0) num_points -- 确保没有进行比赛的队伍的分数为0分
FROM teams t1
left JOIN tem on t1.team_id = tem.id  -- 进行左连接,确保没有进行比赛的队伍也出现在结果表中
GROUP BY team_id,team_name  
ORDER BY num_points DESC,team_id;

四、分析

本题的解题思路为先找到部分答案,然后将多个部分答案合并在求出总答案,逐步分析解决。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词