大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。
文章目录
- 前言
- 一、题目:626. 换座位
- 二、解题
- 1.正确示范①
- 提交SQL
- 运行结果
- 2.正确示范②
- 提交SQL
- 运行结果
- 3.正确示范③
- 提交SQL
- 运行结果
- 4.正确示范④
- 提交SQL
- 运行结果
- 5.其他
- 总结
前言
一、题目:626. 换座位
表: Seat
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
Id是该表的主键列。
该表的每一行都表示学生的姓名和ID。
Id是一个连续的增量。
编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
按 id 升序 返回结果表。
查询结果格式如下所示。
输入:
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 |
+----+---------+
解释:
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。
二、解题
1.正确示范①
提交SQL
select
case when id=num and mod(num,2)=1 then id
when mod(id,2)=0 then id-1 else id+1 end id,
student
from Seat u1,
(select count(1) num from Seat) u2
order by id;
运行结果
2.正确示范②
提交SQL
select
case when id=num and mod(num,2)=1 then id
when mod(id,2)=0 then id-1 else id+1 end id,
student
from Seat u1,
(select max(id) num from Seat) u2
order by id;
运行结果
3.正确示范③
提交SQL
select
case when id=num and mod(num,2)=1 then id
when mod(id,2)=0 then id-1 else id+1 end id,
student
from Seat u1,
(select id as num from Seat order by id desc limit 1) u2
order by id;
运行结果
4.正确示范④
提交SQL
select
if(id=num and mod(num,2)=1,id,if(mod(id,2)=0,id-1,id+1)) id,
student
from Seat u1,
(select id as num from Seat order by id desc limit 1) u2
order by id;
运行结果
5.其他
总结
正确示范①思路:
先计算出总的座位数,
select count(1) num from Seat
当座位号是最后一个并且是奇数数,座位号不变,
当座位号是偶数时,把座位号-1,否则座位号+1
case when id=num and mod(num,2)=1 then id when mod(id,2)=0 then id-1 else id+1 end id
正确示范②思路:
先计算出总的座位数,因为题目说了座位号是连续增量,所以可以通过最大座位号来获取总座位数
select max(id) num from Seat
之后交换规则跟思路①一样;
正确示范③思路:
先计算出总的座位数,因为题目说了座位号是连续增量,所以可以按照座位号降序,取第一个来获取总座位数
select id as num from Seat order by id desc limit 1
之后交换规则跟思路①一样;
正确示范④思路:
把思路①中的case when用法转换为if语法
if(id=num and mod(num,2)=1,id,if(mod(id,2)=0,id-1,id+1)) id