【问题标题】:Sort records by; future ASC, past DESC排序记录;未来 ASC,过去 DESC
【发布时间】:2014-09-17 13:48:02
【问题描述】:

我想对记录进行如下排序:

  1. 未来/现在的事件 ASC
  2. 过去的事件 DESC

所以首先是今天,然后是明天,直到没有更多的未来记录。 然后我想显示过去的事件,但最先显示最新的。

到目前为止,我已经找到了第一点的解决方案:

ORDER BY (
    CASE WHEN ev.StartDate < CURDATE()
          THEN 1
          ELSE 0
     END) ASC, ev.StartDate ASC

但这个查询的问题是所有帖子都是按 ASC 排序的,包括过去的帖子(需要是 DESC)。

如何在CASE 中组合它?

【问题讨论】:

  • 您可以使用日期差异并乘以 -1 来更改过去/现在的顺序。

标签: mysql sql


【解决方案1】:

你需要一个稍微复杂一点的order by

ORDER BY (ev.StartDate < CURDATE()),
         (case when ev.StartDate > CURDATE() then ev.StartDate end) ASC,
         (case when ev.StartDate < CURDATE() then ev.StartDate end) DESC

您实际上可以使用两个子句来做到这一点:

ORDER BY greatest(ev.StartDate, CURDATE()) DESC,
         least(ev.StartDate, CURDATE()) ASC

但我认为第一个版本的意图更清晰。

【讨论】:

    【解决方案2】:

    我发现这是最直接的,不需要复杂的条件语法:

    第一个将未来排在过去之前,第二个排序未来 ASC,第三个排序过去 DESC

    (第二个和第三个可以互换)

    ORDER BY
      (date < CURDATE()) ASC,
      (greatest(date, CURDATE()) ASC,
      (least(date, CURDATE()) DESC
    

    【讨论】:

    • 谢谢!我已经应用并修补了所选代码,但当我有机会/需要时会重新访问。
    【解决方案3】:
    ORDER BY 
    CASE WHEN (CURDATE() > ev.StartDate)
    THEN datediff(CURDATE(),ev.StartDate )  --Past, older date bigger differ
    ELSE datediff(ev.StartDate , CURDATE()+100) END  --Future, differ from a more futrue date
    

    【讨论】:

      【解决方案4】:

      我有同样的要求,但找到了另一种方法

      ORDER BY (CURDATE()>ev.StartDate) ASC, ABS(DATEDIFF(CURDATE(),ev.StartDate))
      

      【讨论】:

        猜你喜欢
        • 2015-03-05
        • 2017-10-27
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        相关资源
        最近更新 更多