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 |
+--------+----+----+----------+
感謝您的解釋!雖然它看起來很慢,但我的意思是,我在桌面上試了20K的記錄,並且它運行了幾分鐘..最終我需要殺死它 – Alvarez
Gordon對我的answef所做的剝離可能會更快運行 –
謝謝,最終你的答案有助於完成戈登的答案:) – Alvarez