一个 mysql 输出数据排序问题

2014-04-12 15:59:45 +08:00
 hellohacker
一个文章表,里面有一个 结束时间字段(int型),这个字段有两种情况:
1:正常的时间 如:1392048000
2:NULL (结束时间不确定)

现在要按照结束时间输出内容,顺序为
大于现在的时间->结束时间不确定的->已结束的

想知道这个sql怎么写
2945 次点击
所在节点    程序员
8 条回复
picasso250
2014-04-12 16:13:13 +08:00
select ifnull(col,now()) as col_ from t order by col_

这样可以吗?
picasso250
2014-04-12 16:21:42 +08:00
实测
SELECT ifnull(time_, UNIX_TIMESTAMP(now())) as _time_ FROM test.t order by _time_


顺便吐槽一句,为什么要用int存时间而不是用timestamp呢?
http://stackoverflow.com/questions/7029127/using-mysqls-timestamp-vs-storing-timestamps-directly
towser
2014-04-12 16:38:31 +08:00
hellohacker
2014-04-12 17:35:29 +08:00
我想知道的是怎么排序 而并非是性能问题
towser
2014-04-12 17:49:23 +08:00
@picasso250 3L
@hellohacker 回应2L的。以为3L是你呢。看看2L给的能不能用吧。
picasso250
2014-04-13 12:43:59 +08:00
@towser timestamp每次update时不一定会自动更新。
CURRENT TIMESTAMP ON UPDATE
towser
2014-04-13 13:53:46 +08:00
@picasso250 当然指默认情况下。
davansy
2014-04-13 14:25:25 +08:00
按照楼主表数据类型的设计,想直接得出按照 “大于现在的时间->结束时间不确定的->已结束的” 排序方式的结果基本不可能(注意是直接得出。) 因为不论怎么样给“结束时间段”赋值 都不好找一个介于现在时间 和 已结束时间的值。mysql 在处理NULL 是会有额外的开销,在楼主的请求了,会把NULL 转化成类似int 0 的方式去处理,所以在这里结束时间不确定的 一定是排在最后面或者最前面。

要实现楼主的方式:
查询大于现在时间和已结束的,再查询结束时间不确定的。然后在业务逻辑里面做对应的排序插入。


另外,楼主的query 对应的数据量比较大的话,会做对"结束时间"的索引吧,做索引尽量避开值为NULL 比较多的列,NULL 在索引中会增加额外的处理开销。换句话说就是会影响性能。

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

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

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

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

© 2021 V2EX