题目描述
小美是一所中学的信息科技老师,她有一张 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 |
+---------+---------+
注意:如果学生人数是奇数,则不需要改变最后一个同学的座位。
MySQL脚本
Create table If Not Exists seat(id int, studentvarchar(255));
Truncate table seat;
insert into seat (id, student) values ('1','Abbot');
insert into seat (id, student) values ('2','Doris');
insert into seat (id, student) values ('3','Emerson');
insert into seat (id, student) values ('4','Green');
insert into seat (id, student) values ('5','Jeames');
本题回答
我们可以分成三块来写,第一块就是id为偶数的,id-1就相当于和奇数的互换了,第二块是id为奇数的,id+1就相当于和偶数的互换了,最后一块是最后一个为奇数的,不换,然后三块合并排序就出来结果了。
方法1
# Write your MySQL query statement below
SELECT s.id,s.student
FROM (SELECT (id-1) AS id,student
FROM seat
WHERE mod(id,2) = 0
UNION
SELECT (id+1) AS id,student
FROM seat
WHERE mod(id,2) = 1 AND id != (SELECT COUNT(*) FROM seat)
UNION
SELECT id,student
FROM seat
WHERE mod(id,2) = 1 AND id = (SELECT COUNT(*) FROM seat)) s
ORDER BY s.id;
需要注意的是,最后一块的过滤条件为WHERE mod(id,2) = 1 AND id = (SELECT COUNT(*) FROM seat
,需要保证id
不为偶数。
方法2——CASE WHEN
# Write your MySQL query statement below
SELECT (CASE
WHEN MOD(id,2)!=0 AND id!=counts THEN id+1
WHEN MOD(id,2)!=0 AND id=counts THEN id
ELSE id-1 END) AS id,student
FROM seat,(SELECT COUNT(*) AS counts FROM seat) AS seat_counts
ORDER BY id;