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 ;