持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
一、题目
表: Seat
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
Id是该表的主键列。 该表的每一行都表示学生的姓名和ID。 Id是一个连续的增量。
编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
按 id 升序 返回结果表。
查询结果格式如下所示。
示例 1:
输入:
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 |
+----+---------+
解释: 请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/ex…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题
创建数据表
创建数据表并填充数据
create table if not exists Seat (
id int,
student varchar(255)
);
truncate table Seat;
insert into Seat values
('1', 'Abbot'),
('2', 'Doris'),
('3', 'Emerson'),
('4', 'Green'),
('5', 'Jeames');
思路
- 根据题意得知,需要交换每两个连续的学生的座位号,如果数量是奇数最后不需要交换
- 那么这里首先要得学生数量,这里使用隐式连接,
count(*)得出学生数量 - 第二步需要修改
id的值,将奇数和偶数的相互交换,这里使用mod(id,2)!=0说明是奇数,这里要计算最后一个id不等于学生的数量那么就id+1 - 如果
id等于学生数量那么id不变,如果是偶数,那么id -1 - 最后将数据进行升序
asc,因为order by默认就是升序,可以不写
执行语句
select (
case
when mod(id, 2) != 0 and id != LastId then id + 1
when mod(id,2) != 0 and id = LastId then id
else id - 1
end) as id,
student
from
Seat,(SELECT COUNT(*) AS LastId FROM Seat) as Seat_LastId
order by id;
三、执行结果
四、总结
- mod():MOD函数用于返回N除以M后的余数,这里用于判断是奇数还是偶数
- case when then else end:
CASE WHEN 条件1 THEN 条件2
ELSE 条件3 END
可以根据条件列表的值返回多个可能的结果表达式中的一个。
- order by:主要用来将查询结果中的数据按照一定的顺序进行排序