2

我正在尝试使用ORDER BY日期按以下顺序从我的表中获取记录:

TODAY (9 PM)
TODAY (7 PM)
TODAY (9 AM)
TODAY (7 AM)
PAST (3 DAYS AGO)
PAST (2 DAYS AGO)
PAST (1 DAYS AGO)
FUTURE (IN 1 DAY)
FUTURE (IN 2 DAYS)
FUTURE (IN 3 DAYS)

目前我正在使用:

SELECT * 
FROM my_table 
ORDER BY 
    IF(DATE(my_date) = DATE(NOW()), 0, 1) ASC,
    IF(DATE(my_date) < DATE(NOW()), 0, 1) ASC,
    my_date ASC

但这给了我:

TODAY (7 AM) - WRONG
TODAY (9 AM) - WRONG
TODAY (7 PM) - WRONG
TODAY (9 PM) - WRONG
PAST (3 DAYS AGO)
PAST (2 DAYS AGO)
PAST (1 DAYS AGO)
FUTURE (IN 1 DAY)
FUTURE (IN 2 DAYS)
FUTURE (IN 3 DAYS)

我尝试使用以下方法更改“今天”排序DESC

IF(DATE(my_date) = DATE(NOW()), 0, 1) DESC,

但随后它只是将记录发送到最底层(甚至低于未来的结果)。这是否可能仅与 SQL 有关,或者我必须使用 CodeIgniter 运行多个查询where()并使用 PHP 合并它们?

4

3 回答 3

8

我认为这将满足指定的要求:

SELECT t.*
  FROM my_table t
 ORDER
    BY DATE(t.my_date)=DATE(NOW()) DESC
     , IF(DATE(t.my_date)=DATE(NOW()),t.my_date,DATE(NULL)) DESC
     , t.my_date ASC

让我们稍微拆开包装。

ORDER BY 中的第一个表达式将评估为1(如果条件测试为真)、0(如果它为假)或NULL(如果其中一个表达式为 NULL。)我们想要降序,以获取符合条件的行是 'true' 首先排序。

第二个表达式是一个 IF 函数。如果 my_date 值的日期部分是今天的日期,那么我们返回my_date. 我们希望按降序排序(根据规范)。否则,我们希望返回一个常量,以便将所有其余行视为“相等”。

第三,我们按 my_date 值升序排序。这不会影响从今天开始的行,那些已经按降序排列的行,所以这实际上只影响到目前为止“相等”的行(这将是“不是今天”)。任何 my_date 值为 NULL 的行都应该最后结束(ORDER BY 中的第一个表达式实际上向我们保证了这一点。)

于 2013-09-12T20:47:18.063 回答
4

Parado 的答案正确地分隔了这些值。但排序也因组而异。值在当天递减,然后在其他日子递增。这是一种方法:

SELECT * 
FROM my_table 
ORDER BY (case when DATE(my_date) = DATE(NOW())
               then my_date
               else date('2000-01-01')
          end
         ) desc,
         my_date asc;

后两组可以合并。当日期按升序排列时,过去在未来之前。

编辑:

`date('2000-01-01') 的目的是让 NULL 值(即不是今天)最后出现。您可以使用三部分逻辑来做到这一点:

SELECT * 
FROM my_table 
ORDER BY (case when DATE(my_date) = DATE(NOW()) then 1 else 2 end),
         (case when DATE(my_date) = DATE(NOW())
               then my_date
          end
         ) desc,
         my_date asc;
于 2013-09-12T20:43:44.077 回答
3

尝试在子句和列中使用CASE语法,如下所示order bymy_date

SELECT * 
FROM my_table 
ORDER BY 
    CASE 
      WHEN DATE(my_date) = DATE(NOW()) THEN 0
      WHEN DATE(my_date) < DATE(NOW()) THEN 1
      WHEN DATE(my_date) > DATE(NOW()) THEN 2
      ELSE 3
    END , DATE(my_date) desc
于 2013-09-12T20:25:56.170 回答