题目:
小美是一所中学的信息科技老师,她有一张 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
COUNT(*) AS counts
FROM
seat
交换方法使用case when
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
完整的sql
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,
(SELECT
COUNT(*) AS counts
FROM
seat) AS seat_counts
ORDER BY id ASC;
交换? 查询座位数,如果学生人数是奇数,则不需要改变最后一个同学的座位
对应语句 WHEN MOD(id, 2) != 0 AND counts = id THEN id
查询所有座位将其命名为counts,从两张表中进行查询 seat表和seat_count表
当id为奇数且id不为最后一位时,将id+1,变为偶数,若为最后一位则保持原id不变
为偶数id-1,变为奇数id
至此,每个人的名字没变id发生了改变,最后通过id升序排序将结果查出