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  |
+---------+---------+

注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。

审题
这道题就是一个换座位的问题,1与2换 3与4换 如果剩下一个奇数项就保留即可
转换一下就是这样一个问题 如果id为奇数则和下一项交换 如果id为偶数则和上一项交换,如果奇数行数据则,最后一项保留

生成数据

CREATE TABLE seat (id INT, student VARCHAR (10)) ;

INSERT INTO seat VALUE(1, 'Abbot'),(2, 'Doris'),(3, 'Emerson'),(4, 'Green'),(5, 'Jeames');

SELECT * 
FROM seat;

自己的解答
按照上边分析出的规律,做一个连接会比较直观吧
但是由于可能出现奇数行,所以需要使用左连接

SELECT *
FROM seat s1
LEFT JOIN seat s2
ON (s1.`id`%2 = 1 AND s1.`id` + 1 = s2.`id`)
OR (s1.`id`%2 = 0 AND s1.`id` - 1 = s2.`id`)

s2表就是我们想要的结果,但是需要加上最后一行
用if条件判断即可

别人的解答
1.改变序号顺序(想不到呀)
先得到总的行数
判断id 若id为奇数且和总数相等 则仍未id
若为偶数则为id-1
否则(id为奇数且不为最后一个) 则id+1

SELECT (CASE 
       WHEN s.id%2 = 1 AND s.id = tmp.cont THEN s.id
       WHEN s.id%2 = 1 THEN s.id +1
       ELSE s.id - 1
       END) AS id, s.student
FROM seat s, (SELECT COUNT(id) cont FROM seat) tmp
ORDER BY id ASC ;

也可以这样写

SELECT (CASE 
       WHEN s.id%2 = 1 AND s.id = (SELECT COUNT(id) cont FROM seat) THEN s.id
       WHEN s.id%2 = 1 THEN s.id +1
       ELSE s.id - 1
       END) AS id, s.student
FROM seat s
ORDER BY id ASC ;

仍然是改变序号顺序,用IF来实现

SELECT 
  IF(
    s.`id` % 2 = 0,
    s.`id` - 1,
    IF(
      s.`id` = 
      (SELECT COUNT(*)  FROM seat),
      s.`id`,
      s.`id` + 1
    )
  ) AS id,
  s.`student` 
FROM
  seat s 
ORDER BY id ASC ;

你可能感兴趣的:(Leetcode626.换座位(中等))