我正在尝试使用带有日期的 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,
但随后它只是将记录发送到最底部(甚至低于 future 的结果)。这可能只使用 SQL 还是我必须使用 CodeIgniter 的 where()
运行多个查询并使用 PHP 合并它们?
最佳答案
我认为这将满足指定的要求:
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。)我们需要降序,以便首先对条件为“真”的行进行排序。
第二个表达式是一个 IF 函数。如果 my_date 值的日期部分是今天的日期,那么我们返回 my_date
。我们希望按降序排序(根据规范)。否则,我们希望返回一个常量,以便所有其余行都将被视为“相等”。
第三,我们按 my_date 值升序排序。这不会影响从今天开始的行,这些行已经按降序排列,所以这实际上只影响到这一点为止“相等”的行(这将是“不是今天”)。 my_date 值为 NULL 的任何行都应该最后结束(ORDER BY 中的第一个表达式实际上向我们保证了这一点。)
关于php - MySQL 按今天、过去、 future 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18773692/