【Mysql】select 按照自定义顺序排序

这周遇到了一个新的需求,为我们的用户在可用状态之外,再增加一个状态,叫做停用。然后用户列表页的排序按照先按照可用,后停用。在这两个排序中,再按照时间顺序倒叙。

对于增加一个状态而言,我们需要在对应的数据库表中新填一个字段 user_status,用来描述用户所处状态。考虑到用户除了正常(可用)状态、停用状态之外,还有其他状态比如说欠费,或者违规状态,就不能使用bit类型,而是使用了tiny int unsigned类型来做数据类型。这样可以使用 八位二进制 256种状态来描述。

对于第一个新的功能模块而言,单纯按照 user_status asc, creatimestamp desc 排序,(斜体表示数据库表字段)但是考虑到如果将来后来者有限的情况,这种排序方式就不能满足条件了。
比如说,1 是 可用状态,2是停用状态。 那当前情况:用户列表页的排序按照先按照可用,后停用。在这两个排序中,再按照时间顺序倒叙,是满足的。
但是,多加一个状态,3是欠费状态。那么排序方式变成 先可用,再欠费,最后停用来说,就不满足了。

查了一下,可以使用数据库 field(数据库字段, 排序最优先内容,排序第二有限内容,…)的方式,来排序。
比如说
select * from account order by field(account.user_status, 0, 1) asc, created desc
就是先按照 用户状态0,1 开始顺序排序,再在各个分类中按照 created 倒序排序。

从这上面来看,用来定义排序顺序的字段最好是一个有限的值,或者说是一个枚举。

因为涉及到数据库计算,所以最好给对应的字段加上一个索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值