「每日一题 - SQL」 - 比赛名单整理


1、比赛名单整理(1星)

有一张参加比赛的队伍名称表competition_list,包括字段team_name(队名):varchar。
每个参赛队伍都会和其他参赛队伍开展一次组队比赛,要求输出两两参赛队伍的所有比赛情况组合(队伍A和队伍B),并按照队名依次升序排列。

注释(思路想法):

第一想法:

就是左连接,最开始使用了 a.team_name <> b.team_name 连接条件,返回了20条记录,因为经常看足球比赛,知道主客场之分,对于该结果,我个人觉得是一定现实意义的。再分析该题目需求来说,并不存在主客场的需求,是另外一种比赛形式,如果双方比赛过一场即可。

这个时候使用了 a.team_name < b.team_name 的连接条件,因为这个team_name一列是存在一定顺序的,这样的话,我们舍弃掉了一些结果,得到和题目需求类似的结果。唯一存在的问题是谁与争锋队作为队伍A的时候,是没有匹配上队伍的,也就是队伍B是NULL值,因为我是使用的左右表连接,所以队伍A是左表中所有的元素,然后team_name有一定的排序,谁与争锋队是在这个顺序中最大的,所以最终导致目前出现NULL值的情况。

这个时候,我又加了一条筛选条件where b.team_name is not null ,来得到最终的结果。

第二想法:

因为第一想法中存在NULL值,然后对其进行删除操作,让我是不是可以使用内连接,这样就不存在没有连接还存在记录的情况。试了试是ok的。

注:试了下两种方法,发现第二种方法相对第一种更快一些。

建表语句:

DROP TABLE IF EXISTS competition_list; 
CREATE TABLE competition_list( 
team_name VARCHAR(8) 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO
competition_list (team_name) 
VALUE 
 ('乘风破浪队') 
 ,('梦之队')
 ,('必胜队') 
 ,('谁与争锋队') 
 ,('群英汇队') 
;

脚本:

  • 想法1:
-- 代码
-- 第一想法:左连接 
select a.team_name as `队伍A`,b.team_name as `队伍B`
from competition_list as a 
left join competition_list as b 
on a.team_name < b.team_name 
where b.team_name is not null 
order by `队伍A` asc, `队伍B` asc  ;
  • 想法2:
-- 第二想法:内连接 
select a.team_name as `队伍A`,b.team_name as `队伍B`
from competition_list as a 
inner join competition_list as b 
on a.team_name < b.team_name 
order by `队伍A` asc, `队伍B` asc ;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计小白er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值