doi*_*tin 1 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)
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用:
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
Run Code Online (Sandbox Code Playgroud)
但这给了我:
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)
Run Code Online (Sandbox Code Playgroud)
我尝试使用更改“今天”的排序DESC:
IF(DATE(my_date) = DATE(NOW()), 0, 1) DESC,
Run Code Online (Sandbox Code Playgroud)
但随后它会将记录发送到最底端(甚至低于将来的结果)。这可能仅与SQL有关where()吗?还是我必须使用CodeIgniter来运行多个查询并使用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
Run Code Online (Sandbox Code Playgroud)
让我们打开一些包装。
ORDER BY中的第一个表达式的计算结果为1(如果条件测试为true),0(如果条件测试为false)或NULL(如果其中一个表达式为NULL。)我们想要降序排列,以获取条件所在的行首先是“真”。
第二个表达式是IF函数。如果my_date值的日期部分是今天的日期,则返回my_date。我们希望按降序(按照规范)对其进行排序。否则,我们想返回一个常数,这样所有其余行将被视为“相等”。
第三,我们按my_date值升序排列。这不会影响从今天开始的行,这些行已经按降序排列,因此,这实际上只会影响到现在为止“相等”的行(即“今天不行”)。my_date值为NULL的任何行都应该最后结束(ORDER BY中的第一个表达式实际上向我们保证了这一点。)