业务开发上遇到分页查询的综合排序:先按时间排序(未开始>进行中>已结束),如果未开始或进行中,则按开始时间正序拍,如果已结束则按开始时间倒序排。
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的整个块,应被视为单个“单元”。