【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 倒序排序。

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

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

你可能感兴趣的:(Mysql)