業務開發上遇到分頁查詢的綜合排序:先按時間排序(未開始>進行中>已結束),如果未開始或進行中,則按開始時間正序拍,如果已結束則按開始時間倒序排。
1 select a.id, a.has_sign_in hasSignIn, a.has_sign_out hasSignOut, if(a.integral = 1, b.integral, 0) integral 2 ,b.kind kind, b.id activityId 3 ,b.name activityName, b.type, b.begin_time beginTime, b.end_time endTime, t.name projectName 4 ,if(b.begin_time >= now(), 2, if(b.end_time <= now(), 3, 1)) idx 5 FROM b 6 LEFT JOIN a 7 ON a.activity_id = b.id and a.has_del = 'N' and a.user_id = #{userId} 8 LEFT JOIN t 9 ON b.training_project_id = t.id 10 WHERE b.has_del = 'N' and (t.has_del is null or t.has_del = 'N') 11 and (a.id is not null or b.kind is not null) 18 order by idx, 19 case when idx = 1 then b.begin_time when idx = 2 then b.begin_time end asc, 20 case when idx = 3 then b.begin_time end desc
這里用if函數先通過時間判斷得到idx,通過idx的大小對時間排序。
然后通過case,when來做正序和倒序的判斷。
注意1:orderby里面是沒有if的。
注意2:從case到end的整個塊,應被視為單個“單元”。
