【问题标题】:ORDER BY date with past dates after upcoming datesORDER BY date 与即将到来的日期之后的过去日期
【发布时间】:2012-09-11 07:58:37
【问题描述】:

我需要对 MySql 数据库中的表执行查询,结果行的顺序如下:

如果今天是 10/09/12:

...
11/09/12 
12/09/12
15/09/12
08/09/12  <--here start the past dates
07/09/12
05/09/12
....

有没有办法直接在 MySQL 中实现这一点?


我是这样解决的:

首先,select 语句包含一个新的布尔值,用于标记日期是过去还是未来:

SELECT DISTINCT *,CASE  WHEN startdate < CURDATE() THEN 0
                ELSE 1 END AS past_or_future 

其次,我做了一个双重“排序”:首先在过去或未来布尔值上,然后在日期上,条件如下:

ORDER BY past_or_future  DESC , CASE WHEN past_or_future  = 1 THEN startdate END ASC, CASE WHEN past = 0 THEN startdate END DESC

通过这种方式,我首先获得了按日期排序的所有即将到来的日期(从低值到高值),然后是从该日期排序的所有过去日期(从高到低)

【问题讨论】:

    标签: mysql sql date sql-order-by


    【解决方案1】:

    即使在ORDER BY 子句中,您仍然可以执行CASE 语句,

    SELECT *
    FROM tableName
    ORDER BY (CASE WHEN DATE(dateColumn) < DATE(GETDATE())
                  THEN 1
                  ELSE 0
             END) DESC, dateColumn ASC
    

    【讨论】:

    • 我搜索了几个关于这种排序的答案,我发现这个是最简单和最快的。谢谢!
    • GETDATE() 是 MsSQL,而不是 MySQL。你可以使用 CURDATE() 代替
    【解决方案2】:

    是的,一种方法是使用“更强大”的排序键将两个查询联合在一起(我使用的是位置而不是下面的列名):

    select 1 as uberkey, date1, column2
      from mytable
      where data1 >= '2012-10-09'
    union all
    select 2 as uberkey, date1, column2
      from mytable
      where data1 < '2012-10-09'
    order by 1 asc, 2 asc
    

    这将使用uberkey 作为主要排序字段,以便以后的日期排在第一位。当您显示数据时,您可以简单地忽略此列。

    这通常比case 之类的每行函数更有效,因为case 必须对每一行进行转换。带有where 子句的两个查询可以简单地使用索引来丢弃另一“半”行,并为检索到的行使用常量。

    而且(虽然我对 MySQL 没有特别的了解,但我自己就是一个 DB2 人)智能 DBMS' 实际上可以并行化查询的两个子组件以提高效率。

    与所有联合一样,如果两个子组件互斥,请确保使用union all,这样就不需要不必要的排序和删除重复操作。

    【讨论】:

      【解决方案3】:

      通常您不能在不使用 UNION 的情况下对一列进行双向排序。 UNION 有一些缺点,特别是如果您使用 ORM。如果你想通过即将到来的 ASC 和过去的 DESC 来订购,你可以使用技巧:

      SELECT yourDateColumn,IF(yourDateColumn)

      您也可以将它与 ORM 一起使用,并且仍然使用分页器等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-21
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2022-11-16
        • 2021-12-23
        • 2013-04-21
        相关资源
        最近更新 更多