返回介绍

solution / 1200-1299 / 1212.Team Scores in Football Tournament / README

发布于 2024-06-17 01:03:21 字数 3748 浏览 0 评论 0 收藏 0

1212. 查询球队积分

English Version

题目描述

表: 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_namenum_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       |
+------------+--------------+---------------+

解法

方法一:左连接 + 分组 + CASE 表达式

我们可以通过左连接,将 Teams 表和 Matches 表连接起来,连接的条件为 team_id = host_team OR team_id = guest_team,这样就可以得到每个球队的所有比赛信息。

接下来,我们按照 team_id 分组,然后使用 CASE 表达式计算每个球队的积分,计算规则如下:

  • 如果球队是主队,且主队进球数大于客队进球数,则积分加 $3$ 分;
  • 如果球队是客队,且客队进球数大于主队进球数,则积分加 $3$ 分;
  • 如果主队和客队进球数相同,则积分加 $1$ 分;

最后,我们按照积分降序排序,如果积分相同,则按照 team_id 升序排序。

# Write your MySQL query statement below
SELECT
  team_id,
  team_name,
  SUM(
    CASE
      WHEN team_id = host_team
      AND host_goals > guest_goals THEN 3
      WHEN team_id = guest_team
      AND guest_goals > host_goals THEN 3
      WHEN host_goals = guest_goals THEN 1
      ELSE 0
    END
  ) AS num_points
FROM
  Teams
  LEFT JOIN Matches ON team_id = host_team OR team_id = guest_team
GROUP BY 1
ORDER BY 3 DESC, 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文