小美是一所中學的信息科技老師,她有一張 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-1就相當於和奇數的互換了,第二塊是id爲奇數的,id+1就相當於和偶數的互換了,最後一塊是最後一個爲奇數的,不換,然後三塊合併排序就出來結果了。
select s.id,s.student from
(
select id-1 as id ,student from seat where mod(id,2)=0
union
select id+1 as id,student from seat where mod(id,2)=1 and id !=(select count(*) from seat)
union
select id,student from seat where mod(id,2)=1 and id = (select count(*) from seat)
) s order by id;
拓展:當原id爲奇數時,交換座位後的id變爲id+1,當原id爲偶數時,交換座位後的id變爲id-1,
注意:學生人數爲奇數時,最後一個學生的id不變,故應當用子查詢確定學生的人數,然後分情況討論。
select (case
when mod(id,2)!=0 and id!=counts then id+1
when mod(id,2)!=0 and id=counts then id
else id-1 end)as id,student
from seat,(select count(*)as counts from seat)as seat_counts
order by id;