(LeetCode626:换座位)

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

示例

+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
+---------+---------+

假如数据输入的是上表,则输出结果如下:

+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
+---------+---------+

注意:

如果学生人数是奇数,则不需要改变最后一个同学的座位。
Solution:
根据题目,调整学生作为,可以分为三种情况:

  1. 座位号为奇数, 最后一个学生, id 不变
  2. 座位号为奇数, 不是最后一个学生, id+1
  3. 座位号为偶数, id-1

方法一

select * from (
SELECT id,student from seat where mod(id,2)=1 and id= (select count(id) from seat)
UNION 
SELECT id+1,student from seat where mod(id,2)=1 and id!=(select count(id) from seat)
UNION 
SELECT id-1,student from seat where mod(id,2)=0
) d ORDER BY id;

a. 分析出三种情况
b. union 拼接处不同情况 select 结果集
c. 最后对结果集进行排序,order by id (默认降序)

方法二

SELECT (case 
        when mod(id,2)=1 and id=(select COUNT(id) from seat) then id
        when mod(id,2)=1 and id!=(SELECT count(id) from seat) then id+1
        else id-1 end) 
as id,student from seat ORDER BY id;

方法二使用 case when 函数 区分出这三种情况

caee when 函数
mysql 的case when 函数有两种语法:

  1. 简单函数
    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END

2.搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END

    原文作者:lconcise
    原文地址: https://www.jianshu.com/p/4fd3939dc4d8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞