表: Seat
1 2 3 4 5 6 7 8 9 +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | student | varchar | +-------------+---------+ id 是该表的主键(唯一值)列。 该表的每一行都表示学生的姓名和 ID。 ID 序列始终从 1 开始并连续增加。
编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
按 id
升序 返回结果表。
查询结果格式如下所示。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 输入: Seat 表: +----+---------+ | id | student | +----+---------+ | 1 | Abbot | | 2 | Doris | | 3 | Emerson | | 4 | Green | | 5 | Jeames | +----+---------+ 输出: +----+---------+ | id | student | +----+---------+ | 1 | Doris | | 2 | Abbot | | 3 | Green | | 4 | Emerson | | 5 | Jeames | +----+---------+ 解释: 请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
解题思路 通过 IF
嵌套函数实现座位交换的逻辑判断:
对于偶数 ID(id%2=0
):将其 ID 减 1(与前一个奇数 ID 交换)
对于奇数 ID:
如果是最后一个 ID(id=总记录数
):保持不变
否则:将其 ID 加 1(与后一个偶数 ID 交换)
最后按新计算的 ID 排序
代码实现 1 2 3 4 5 6 7 8 9 select if(id%2=0, id-1, if(id=(select count(distinct id) from seat), id, id+1)) as id,student from seat order by id;