每日一道SQL题(五)

一、626. 换座位

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

示例:

idstudent
1Abbot
2Doris
3Emerson
4Green
5Jeames

假如数据输入的是上表,则输出结果如下:

idstudent
1Doris
2Abbot
3Green
4Emerson
5Jeames

注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。

题目连接

二、解题思路

  • 交换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来尝试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值