描述
小美是一所中学的信息科技老师,她有一张 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 |
+---------+---------+
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
解题
SELECT
*
FROM
(SELECT(
CASE WHEN
id MOD 2 = 1 AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN
id MOD 2 = 0 THEN id - 1
ELSE
id + 1
END) id,
student
FROM
seat) a
ORDER BY
a.id
ASC
可以对 id 入手, 使用触发器的方式, case when else end 先写的先执行, 所以判断 id 是否是最后一个, 并且是否是奇数就很重要了. 还有一种方式如下, 比较繁琐. 但也是一种思路
SELECT
id-1 id,
student
FROM
seat
WHERE
id MOD 2 = 0
UNION
SELECT
id+1 id,
student
FROM
seat
WHERE
id MOD 2 = 1 AND
id NOT IN (SELECT MAX(id) FROM seat)
UNION
SELECT
id,
student
FROM
seat
WHERE
id MOD 2 = 1 AND
id IN (SELECT MAX(id) FROM seat)
ORDER BY id ASC
这个是使用 union 拼接起来的, 最后得出的数据也是可行的