这道题本身不难,主要是没思路。
题目:
表: Seat
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | student | varchar | + -------------+---------+
id是该表的主键(唯一值)列。
该表的每一行都表示学生的姓名和 ID。 id 是一个连续的增量
要求:
编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。
按
id
升序 返回结果表。
创建数据库
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')
分析:
首先我们要理解题意,首先要求换座位交换两个连续学生的座位号。就是id=1的学生abbot变成id=2 abbot,而id=2doris变成id=1doris。以此类推。当学生数为奇数时最后一个学生的不用变。
代码思路:
首先,我们思考发现无法直接用sql查询语句把他们直接的得出来。所以我们可以分布进行。首先我们先考虑学生数为偶数情况下怎么换位置。我们可以让学生id与2进行取模等于0的让他们的id-1这样就把偶数id的学生变到上一名的位置上面
select id - 1 id, student
from seat
where id % 2 = 0
其次,我们可以用相同的方法让奇数id的学生提取出来让他们的id+1。但是这里我们要考虑学生数为奇数情况下,最后一名不需要摘出来。学生数为偶数情况下不需要考虑。但我们需要加上筛选。id != (select max(id) from seat) id不等于最大的奇数id
select id + 1 id, student
from seat
where id % 2 = 1
and id != (select max(id) from seat)
然后我们对学生数为奇数情况下。得到最后一名奇数id的学生。
select id, student
from seat
where id = (select max(id) from seat)
and id % 2 != 0;
然后我们通过union函数进行合并union函数和union all函数都可以筛选出来。最后合并完之后我们对他们进行id排序就可以得到想要的结果。
select id - 1 id, student
from seat
where id % 2 = 0
union
select id + 1 id, student
from seat
where id % 2 = 1
and id != (select max(id) from seat)
union
select id, student
from seat
where id = (select max(id) from seat)
and id % 2 != 0
order by id asc ;