小美是一所中学的信息科技老师,她有一张 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 |+---------+---------+
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
Solution:
根据题目,调整学生作为,可以分为三种情况:
座位号为奇数, 最后一个学生, id 不变
座位号为奇数, 不是最后一个学生, id+1
座位号为偶数, id-1
方法一
select * from ( SELECT id,student from seat where mod(id,2)=1 and id= (select count(id) from seat) UNION SELECT id+1,student from seat where mod(id,2)=1 and id!=(select count(id) from seat) UNION SELECT id-1,student from seat where mod(id,2)=0) d ORDER BY id;
a. 分析出三种情况
b. union 拼接处不同情况 select 结果集
c. 最后对结果集进行排序,order by id (默认降序)
方法二
SELECT (case when mod(id,2)=1 and id=(select COUNT(id) from seat) then id when mod(id,2)=1 and id!=(SELECT count(id) from seat) then id+1 else id-1 end) as id,student from seat ORDER BY id;
方法二使用 case when 函数 区分出这三种情况
caee when 函数
mysql 的case when 函数有两种语法:
简单函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
2.搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
作者:lconcise
链接:https://www.jianshu.com/p/4fd3939dc4d8
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦