Mysql 查询排序

2016-11-11 10:37:24 +08:00
 longggg

我有一个工单表,其中有一个 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 查询数据。 请大家不吝赐教。谢谢

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

@aprikyblue 我接手别人的项目😂。我自己也还是一个小兵,所以有很多没考虑到,现在遇到问题了才来逐步解决。
xinyewdz
2016-11-11 18:07:08 +08:00
以后有需求,改变状态的排序。然后楼主就哭了。
longggg
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!
结贴!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/319761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX