V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
longggg
V2EX  ›  问与答

Mysql 查询排序

  •  
  •   longggg · 2016-11-11 10:37:24 +08:00 · 1197 次点击
    这是一个创建于 2737 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个工单表,其中有一个 status 的字段,值有: commit 、 replied 、 transfer 、 solved... 现在有个需求是按照 commit 、 transfer 、 replied 、 solved 状态,再按照提交时间 created_at ,对工单进行排序展示。

    解决方案目前想到有两个:
    1 、添加一列专用于排序,感觉代价略大。
    2 、在 status 的值前面添加前缀,例如 0_commit, 1_transfer 、 3_replied 、 4_solved... 这样直接 order by status, created_at 也可以满足需求。 但我在想有没有直接能解决需求的方案而不用改动数据库数据呢?

    我使用的 py Django 框架, Orm 查询数据。 请大家不吝赐教。谢谢

    6 条回复    2016-11-23 18:04:00 +08:00
    mifly
        1
    mifly  
       2016-11-11 11:52:40 +08:00 via iPhone
    Status 记录数字,代码中把数字映射成字符返回前端展现
    default
        2
    default  
       2016-11-11 12:18:11 +08:00
    status 用数字比较好,既能满足排序需求,还提高性能。
    aprikyblue
        3
    aprikyblue  
       2016-11-11 12:21:27 +08:00 via Android
    所以。。当初谁设计的 status 保存字符串。。
    longggg
        4
    longggg  
    OP
       2016-11-11 14:18:12 +08:00
    @mifly @default 懂了, 谢谢。按照 0 : commit, 1 : transfer 、 3 : replied 、 4 : solved 做映射。

    @aprikyblue 我接手别人的项目😂。我自己也还是一个小兵,所以有很多没考虑到,现在遇到问题了才来逐步解决。
    xinyewdz
        5
    xinyewdz  
       2016-11-11 18:07:08 +08:00 via Android
    以后有需求,改变状态的排序。然后楼主就哭了。
    longggg
        6
    longggg  
    OP
       2016-11-23 18:04:00 +08:00
    @xinyewdz 是的,所以我又查了查资料。
    mysql 的 field 方法满足情况。最棒的答案。
    奉上链接: http://stackoverflow.com/questions/8322849/mysql-order-by-specific-id-values
    Django 的实现例子: Model.objects.extra(select={'status': "FIELD(status, 'commit', 'transfer', 'replied', 'solved')"}, order_by=['status', '-time_updated'])

    perfect!
    结贴!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3168 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:19 · PVG 22:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.