626. 換座位

小美是一所中學的信息科技老師,她有一張 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;  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章