【问题标题】:Mysql ORDER BY using date data rowMysql ORDER BY 使用日期数据行
【发布时间】:2010-10-27 04:43:21
【问题描述】:

我有一个类似这样的查询:

SELECT 
 title, desc, date 
FROM 
 tablename 
ORDER BY 
 date ASC, title ASC;

当数据实际上有一个日期时可以正常工作。问题是,日期提交是可选的,所以我有时会得到 0000-00-00 作为日期,这会导致将所有未注明日期的行都放在最前面。

所以,我然后尝试了这个:

SELECT 
 title, desc, date 
FROM 
 tablename 
ORDER BY 
 date DESC, title ASC;

哪种有效,但不是真的——所有日期(非 0000-00-00)的项目按降序排列,然后是所有日期为 0000-00-00 的项目。

我想做的是按日期 ASC 排序,标题 ASC,但前提是日期!= 0000-00-00,但如果日期 = 0000-00-00,那么只需按标题 ASC 排序(我想我的解释是正确的)。

我能想到的唯一方法是基于非 SQL 的(或者 2 个查询,或者,每个查询只填充一个内存数组,然后我使用 PHP 进行排序)。

有没有可以做到这一点的 SQL 查询?

【问题讨论】:

  • MySQL 不支持 NULL 日期吗?

标签: php sql mysql sql-order-by


【解决方案1】:
ORDER BY date = '0000-00-00' ASC, date ASC, title ASC

【讨论】:

    【解决方案2】:

    您的 2 查询解决方案是一个很好的解决方案,您可以使用UNION 命令在 SQL 中完成所有操作。

    第一个查询将针对非零日期,然后在查询中使用 UNION 查询零日期。

    编辑:类似:

    SELECT * FROM tbl 
       WHERE DATE != '0000-00-00' 
       ORDER BY date ASC 
    UNION SELECT * FROM tbl
       WHERE DATE = '0000-00-00'
       ORDER BY title ASC
    

    这在这种情况下可能不是很有用,但对于复杂的查询,UNION 可以派上用场。

    【讨论】:

    • 当我像这样在选择块周围放置括号时,这很有效:( SELECT * FROM tbl WHERE DATE != '0000-00-00' ORDER BY date ASC ) UNION ( SELECT * FROM tbl WHERE DATE = '0000-00-00' 按标题 ASC 排序)
    • 哎呀,你是对的,UNION 在技术上做事没有顺序问题,但括号阻止了这一点,我相信它确实这么说。
    猜你喜欢
    • 2019-06-09
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2012-05-24
    • 2020-10-15
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多