换座位

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;

三、执行结果

image.png

四、总结

  • mod():MOD函数用于返回N除以M后的余数,这里用于判断是奇数还是偶数
  • case when then else end:
CASE WHEN 条件1 THEN 条件2
    ELSE 条件3 END

可以根据条件列表的值返回多个可能的结果表达式中的一个。

  • order by:主要用来将查询结果中的数据按照一定的顺序进行排序