0x01.需求
小美是一所中學的信息科技老師,她有一張 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 |
+---------+---------+
注意: 如果學生人數是奇數,則不需要改變最後一個同學的座位。
SQL架構:
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')
0x02.解決需求思路
交換id的整體思路如下:
- 先查詢座位數量,目的是得到最後一位同學的id。
- 使用
CASE END
和WHEN THEN
語句。 - 如果id是奇數,則id+1,最後一位同學不變。
- 如果id是偶數,則id-1。
- 最後對錶格進行升序排序。
0x03.SQL語句
SELECT
(CASE
WHEN MOD(id,2)!=0 AND counts!=id THEN id+1
WHEN MOD(ID,2)!=0 AND counts=id THEN id
ELSE id-1
END) AS id,
student
FROM
seat,
(SELECT
COUNT(*) AS counts
FROM
seat) AS seat_counts
ORDER BY id ASC;
ATFWUS --Writing By 2020–03–31