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

标签 php mysql sql sql-order-by

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

相关文章:

mysql - Visual Studio 连接 MySql 错误

mysql - 在源代码管理中存储 MySQL 数据库的最佳方式是什么?

MySQL:用最后一个已知值填补空白

php - 多个 shell_exec 到一个 shell_exec

PHP 正则表达式验证

php - html注册表单不将数据保存在mysql中

sql - 在 Go Postgresql 中防止 SQL 注入(inject)

php - mySQL 和 XAMPP 的冲突端口

mysql - 实时分析 mysql - 查找长时间运行的查询

sql - Presto SQL 透视(因为缺少更好的词)数据