Mysql 按顺序对记录进行排序;未来ASC,过去描述

Mysql 按顺序对记录进行排序;未来ASC,过去描述,mysql,sql,Mysql,Sql,我想对记录进行如下排序: 未来/现在事件ASC 过去事件描述 所以先是今天,然后是明天,直到没有更多的未来记录。 然后我想展示过去的事件,但首先是最新的事件 到目前为止,我已经找到了第一点的解决方案: ORDER BY ( CASE WHEN ev.StartDate < CURDATE() THEN 1 ELSE 0 END) ASC, ev.StartDate ASC orderby( ev.StartDate

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

  • 未来/现在事件ASC
  • 过去事件描述
  • 所以先是今天,然后是明天,直到没有更多的未来记录。 然后我想展示过去的事件,但首先是最新的事件

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

    ORDER BY (
        CASE WHEN ev.StartDate < CURDATE()
              THEN 1
              ELSE 0
         END) ASC, ev.StartDate ASC
    
    orderby(
    ev.StartDate
    但是这个查询的问题是所有帖子都是按ASC排序的,包括过去的帖子(需要是DESC)


    案例中如何将其组合?

    您需要一个稍微复杂一点的
    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 
    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
    
    第一个命令在过去之前排列未来,第二个命令未来ASC,第三个命令过去DESC

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

    orderby
    (日期
    我有同样的要求,找到了另一种方法

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

    您可以使用日期差并与-1相乘来更改过去/现在的顺序。谢谢!我已经应用并修补了所选代码,但如果有机会/需要,将重新讨论此问题。
    ORDER BY
      (date < CURDATE()) ASC,
      (greatest(date, CURDATE()) ASC,
      (least(date, CURDATE()) DESC
    
    ORDER BY (CURDATE()>ev.StartDate) ASC, ABS(DATEDIFF(CURDATE(),ev.StartDate))