按记录排序;未来的ASC,过去的DESC

时间:2014-09-17 13:48:03

标签: mysql sql

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

  1. 未来/现在的活动ASC
  2. 过往事件DESC
  3. 首先是今天,然后是明天,直到没有更多的未来记录。 然后我想展示过去的事件,但是最新的事件。

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

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

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

    如何在CASE

    中将其合并

4 个答案:

答案 0 :(得分:9)

您需要稍微复杂一点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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

我有相同的要求并找到了另一种方式

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