小美是一所中学的信息科技老师,她有一张 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