Mysql case when用法——以查询球队积分为例

以查询球队积分为例分析Mysql中case when的用法

问题描述


Teams表:

Column NameType
team_idint
team_namevarchar

 此表的主键是 team_id,表中的每一行都代表一支独立足球队。

Matches表

Column NameType
match_idint
host_teamint
guest_teamint
host_goalsint
guest_goalsint

 此表的主键是 match_id,表中的每一行都代表一场已结束的比赛,比赛的主客队分别由它们自己的 id 表示,他们的进球由 host_goals 和 guest_goals 分别表示。

 积分规则:

  • 赢一场得3分
  • 平局得1分
  • 输一场得0分

 写出一条SQL语句以查询每个队的 team_id,team_name 和 num_points。结果根据 num_points 降序排序,如果有两队积分相同,那么这两队按 team_id 升序排序。

问题示例

Teams table:

team_idteam_name
10Leetcode FC
20NewYork FC
30Atlanta FC
40Chicago FC
50Toronto FC


Matches table:

match_idhost_teamguest_teamhost_goalsguest_goals
1102030
2301022
3105051
4203010
5503010


Result table:

team_idteam_namenum_points
10Leetcode FC7
20NewYork FC3
50Toronto FC3
30Atlanta FC1
40Chicago FC0

问题求解

select team_id, team_name, 
sum(num_points) as num_points
from (
    select *
    from (
        select t1.team_id, t1.team_name,
        sum(
            case
            when m1.host_goals > m1.guest_goals then 3
            when m1.host_goals = m1.guest_goals then 1
            when m1.host_goals < m1.guest_goals then 0
            when m1.host_goals is null then 0
            end
        ) as num_points
        from teams as t1
        left join matches as m1
        on t1.team_id = m1.host_team
        group by t1.team_id
    ) as t 
    union all
    select *
    from (
        select t2.team_id, t2.team_name,
        sum(
            case
            when m2.host_goals < m2.guest_goals then 3
            when m2.host_goals = m2.guest_goals then 1
            when m2.host_goals > m2.guest_goals then 0
            when m2.guest_goals is null then 0
            end
        ) as num_points
        from teams as t2
        left join matches as m2
        on t2.team_id = m2.guest_team
        group by t2.team_id
    ) as tt
    ) as ttt
group by team_id
order by num_points desc, team_id asc

问题分析


 此问题首先要分为主场和客场,对这两种情况分别查询,然后用union all进行连接。

 每种情况中,用sum(case when)进行判断并求和,注意由于用的是左连接(因为有的队没有主场或客场),因此要加上空值的判断when m1.host_goals is null then 0,最后别忘了用end

 在将两种情况分别判断并连接后,要再用一次查询,最后再按照顺序要求进行排序。要注意的是,由于涉及到的表比较多,但每个表都要记得起别名。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值