2017-03-16 41 views
2

我有這樣的表結構按邏輯排序並得到混合結果?

id | status 
-----+------+ 
1 | a | 
2 | b | 
3 | b | 
4 | b | 
5 | a | 
6 | a | 
7 | b | 
8 | a | 

我有兩個狀態 「A」 和 「B」。 我需要通過這樣的邏輯來排序:對於每兩個「a」,顯示一個「b」。 因此,像這樣(「一」是更重要的,所以如果有很多的,他們只會在年底離開「B」上)

id | status 
-----+------+ 
1 | a | 
5 | a | 
2 | b | 

6 | a | 
8 | a | 
3 | b | 

4 | b | 
7 | b | 

有沒有辦法做到這一點?

回答

3
select  id 
      ,status 

from  (select  status 
         ,id 
         ,@prev_status := @status 
         ,@status  := status 
         ,@rn   := case when @prev_status = status 
              then @rn + 1 
              else 1 
             end   as rn 

      from  mytable t1,(select @status:=null,@rn:=0) x 

      order by status 
         ,id 
      ) t 

order by floor((rn-1)/case status when 'a' then 2 else 1 end)   
      ,case status when 'a' then 1 else 2 end 
      ,rn 
; 

+----+--------+ 
| id | status | 
+----+--------+ 
| 1 | a  | 
| 5 | a  | 
| 2 | b  | 
| 6 | a  | 
| 8 | a  | 
| 3 | b  | 
| 4 | b  | 
| 7 | b  | 
+----+--------+ 

這將幫助你瞭解該解決方案:
(GROUP_ID = floor((rn-1)/case status when 'a' then 2 else 1 end)

+--------+----+----+----------+ 
| status | id | rn | group_id | 
+--------+----+----+----------+ 
| a  | 1 | 1 |  0 | 
| a  | 5 | 2 |  0 | 
| a  | 6 | 3 |  1 | 
| a  | 8 | 4 |  1 | 
| b  | 2 | 1 |  0 | 
| b  | 3 | 2 |  1 | 
| b  | 4 | 3 |  2 | 
| b  | 7 | 4 |  3 | 
+--------+----+----+----------+ 
+0

感謝您的解釋!雖然它看起來很慢,但我的意思是,我在桌面上試了20K的記錄,並且它運行了幾分鐘..最終我需要殺死它 – Alvarez

+0

Gordon對我的answef所做的剝離可能會更快運行 –

+0

謝謝,最終你的答案有助於完成戈登的答案:) – Alvarez

2

使用變量枚舉值,然後一些簡單的邏輯:

select id, status 
from (select t.*, 
      (@rn := if(@s = status, @rn + 1, 
         if(@s := status, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @rn := 0, @s := '') params 
     where status in ('a', 'b') 
     order by status, id 
    ) ab 
order by (case when status = a then floor((rn - 1)/2) else (rn - 1) end), 
     status, id; 
+0

加油....... –

+0

這應該是MySQL中最快的方法。它比相關的子查詢更清晰,但我承認對MySQL中的變量有一定的熟悉度。 –

+0

我認爲這是我第一次看到你使用變量生成行號。我記得,你總是使用相關的子查詢:-) –