1.题目
编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id
升序 返回结果表。
2.数据准备
Create table If Not Exists Seat (id int, student varchar(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');
3.方法1
332 ms击败 87.59%
1.change1
子查询
- 选择
Seat
表中的id
字段。 - 使用
CASE
语句根据id
的奇偶性生成新的new_id
:- 如果
id
是奇数(MOD(id, 2) <> 0
),则new_id
是id + 1
(使其变为偶数)。 - 如果
id
是偶数,则new_id
是id - 1
(使其变为奇数)。
- 如果
2.last
子查询
- 从
Seat
表中选择最后一条学生记录(根据id
降序排序)。 - 这意味着查询将返回具有最大 ID 的学生。
3.主查询
- 从
change1
子查询中选择t1.id
和student
字段。 - 使用
LEFT JOIN
将change1
的结果与Seat
表连接,条件是t1.new_id = t2.id
。 CASE
语句用于决定student
字段的值:- 如果
t2.student
不为空(即找到了对应的学生),则返回该学生的姓名。 - 如果
t2.student
为空(即没有找到对应的学生),则返回last
子查询的结果(最后一位学生的姓名)。
- 如果
WITH change1 as(
SELECT id,
CASE WHEN MOD(id,2)<>0 then id+1
ELSE id-1 END AS new_id
FROM Seat
),
last as(
SELECT student
FROM Seat
ORDER BY id DESC
LIMIT 1
)
SELECT
t1.id
,CASE WHEN t2.student IS NOT NULL THEN student
WHEN student IS NULL THEN (SELECT * from last) END AS student
FROM change1 t1
LEFT JOIN Seat t2 ON t1.new_id = t2.id
4.方法2
314 ms击败 99.10%
1.last
子查询
- 从
Seat
表中选择 ID 字段,按 ID 降序排列,返回最后一条记录的 ID(即最大 ID)。 - 这一步骤用于后续条件判断。
2.主查询
- 使用
CASE
语句处理每个学生的 ID:- 偶数 ID:如果 ID 是偶数,返回
id - 1
(将偶数转换为其前一个奇数)。 - 最大 ID:如果 ID 是最大 ID,保持不变,返回该 ID。
- 奇数 ID:否则(即 ID 是奇数),返回
id + 1
(将奇数转换为其后一个偶数)。
- 偶数 ID:如果 ID 是偶数,返回
- 同时选择
student
字段。 - 按处理后的 ID 进行排序。
WITH last as(
SELECT id FROM Seat ORDER BY id DESC LIMIT 1
)
SELECT CASE WHEN MOD(id,2) = 0 THEN id-1
WHEN id =(SELECT * from last) then id
ELSE id+1 end as id,student
from Seat
order by id
标签:last,student,Seat,Leetcode,ID,解析,id,SELECT,626 From: https://blog.csdn.net/Yaoo415/article/details/142512452