以下复杂排序,都无法利用到索引,可能导致全表扫描,严重降低效率,如果使用,建议搭配缓存。如果是新项目,请考虑利用字段冗余,而不是搞一些花里胡哨的。
表结构
record
字段 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
useStatus | tinyint | 使用状态 1 未使用 2 已经使用 |
useExpireTime | int | 保存过期时间 -1 永不过期(时间戳) |
useTime | int | 使用时间 未使用 0(时间戳) |
需求一
按照过期升序排序,但永不过期的排在最后
SELECT
*
FROM
card_user_record
WHERE
useStatus = 1
AND useExpireTime < 1619884800
ORDER BY
useExpireTime != - 1 DESC,
useExpireTime ASC,
id ASC
需求二
按照使用时间排序,如果是自然过期,则按照过期时间排序
SELECT
*
FROM
card_user_record
WHERE
useStatus = 2
OR (
useStatus = 0
AND useExpireTime < 1619884800
)
ORDER BY
(useTime < useExpireTime) * useExpireTime + (useTime >= useExpireTime) * useTime DESC,
id DESC