一、626. 换座位
小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
示例:
id | student |
---|---|
1 | Abbot |
2 | Doris |
3 | Emerson |
4 | Green |
5 | Jeames |
假如数据输入的是上表,则输出结果如下:
id | student |
---|---|
1 | Doris |
2 | Abbot |
3 | Green |
4 | Emerson |
5 | Jeames |
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
二、解题思路
- 交换id
- 交换student
1. case when + mod
根据题意我们可以想到,当id为奇数的时候id+1,当id为偶数的时候id-1;特殊情况:如果人数为奇数,id不变。
代码如下(示例):
#总人数
select count(*) as counts from seat
#上述结果与seat表关联
select
case when mod(id, 2) != 0 and counts != id then id + 1
when mod(id, 2) != 0 and counts = id then id
else id - 1 end as id
,student
from seat as s
inner join (
select
count(*) as counts
from seat
) as tmp
order by id asc
2.使用if交换student
自关联,在on中使用if对id进行判断,决定输出student的值
代码如下(示例):
select
t1.id
,IFNULL(t2.student, t1.student) as student
from seat t1
left outer join seat t2
on if(t1.id % 2 = 1, t1.id = t2.id - 1, t1.id = t2.id + 1)
order by t1.id
总结
变更,交换类的需求都可以考虑case when或者if来尝试