Mybatis orderby复杂排序

业务开发上遇到分页查询的综合排序:先按时间排序(未开始>进行中>已结束),如果未开始或进行中,则按开始时间正序拍,如果已结束则按开始时间倒序排。

 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的大小对时间排序。

然后通过casewhen来做正序和倒序的判断。

注意1orderby里面是没有if的。

注意2:从caseend的整个块,应被视为单个“单元”。

posted @ 2020-10-22 16:53  空指针终结者  阅读(1150)  评论(0)    收藏  举报