V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hellohacker
V2EX  ›  程序员

一个 mysql 输出数据排序问题

  •  
  •   hellohacker · 2014-04-12 15:59:45 +08:00 · 2938 次点击
    这是一个创建于 3659 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个文章表,里面有一个 结束时间字段(int型),这个字段有两种情况:
    1:正常的时间 如:1392048000
    2:NULL (结束时间不确定)

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

    想知道这个sql怎么写
    8 条回复    1970-01-01 08:00:00 +08:00
    picasso250
        1
    picasso250  
       2014-04-12 16:13:13 +08:00
    select ifnull(col,now()) as col_ from t order by col_

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

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


    另外,楼主的query 对应的数据量比较大的话,会做对"结束时间"的索引吧,做索引尽量避开值为NULL 比较多的列,NULL 在索引中会增加额外的处理开销。换句话说就是会影响性能。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5460 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 03:12 · PVG 11:12 · LAX 20:12 · JFK 23:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.