gpt4 book ai didi

php - MySQL 按今天、过去、 future 排序

转载 作者:行者123 更新时间:2023-11-29 03:50:05 24 4
gpt4 key购买 nike

我正在尝试使用带有日期的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com