java mysql排序_MySQL自定义排序

在我们写业务代码的时候,会经常碰见排序方式既不是正序也不是倒序。

例如:有一个简单的任务task表,表结构如下:

id : 任务ID

start-time:任务开始时间

end_time:任务结束时间

deal_status:任务状态 0 未开始  1  进行中   2 已处理

需求1

按照自定义状态排序:

正序:进行中、未开始、已处理

倒序:已处理、未开始、进行中

发现无论是 asc 还是desc 都无法实现。这时候我们可以使用mysql的field实现。

-- 正序

SELECT * FROM `task` order by field(deal_status,1,0,2)

-- 倒序

SELECT * FROM `task` order by field(deal_status,2,0,1)

需求2

增加延期状态,即实际接口返回状态:0 未开始  1 进行中  2 已处理   3 延期(当前时间>end_time并且未处理的任务)

按照以下状态排序

正序:进行中、未开始、延期、已处理

倒序:已处理、延期、未开始、进行中

这时我们发现使用需求1里面的方式并不能解决问题了,可使用mysql里的case来对原有的状态进行重新赋值,以便于个性化排序

SELECT

id,start_time,end_time,deal_status,

CASE

WHEN deal_status = 0 THEN

1

WHEN deal_status = 1 THEN

0

WHEN deal_status = 2 THEN

3

WHEN deal_status != 2 AND NOW() > end_time THEN

2

ELSE

deal_status

END sort_status

FROM

`task`

order by sort_status asc/desc

需求3

上面的两种排序方法已经能满足大部分需求,但是产品的脑洞没有上限啊,需求如下:

按照以下状态排序:进行中  延期  未开始  已处理

同一状态(已处理除外)展示顺序为:

①截止时间倒序

②开始时间倒序

已处理状态展示顺序为处理完成时间倒序。

虽然这个需求也可以通过需求2里面的方式解决,但是为了后续还有更复杂的排序同时也为了系统性能,我直接增加个sort字段(bigint)。

思路:每次新增修改数据都会计算计算这一行数据的权重,然后根据权重实现排序。延期的任务由定时任务每天去计算权重

计算公式:(开始时间戳 + 截止时间戳 * 2 )+状态[20 进行中 15 延期 10 未开始 5 已处理] * 当前时间戳

你可能感兴趣的:(java,mysql排序)