根据当前日期对数据进行排序

usm*_*ali 5 mysql sql

我有一个表posts像这样

+--------------------+--------------+
| Field              | Type         |
+--------------------+--------------+
| id                 | int(11)      |
| title              | varchar(255) |
| body               | text         | 
| published_at       | datetime     |
+--------------------+--------------+
Run Code Online (Sandbox Code Playgroud)

我想要实现的是order通过published_at.通常我会这样做:

SELECT * FROM posts ORDER BY published_at;
Run Code Online (Sandbox Code Playgroud)

但我的要求是,查询应该从当前日期获取结果,然后是之前的日期,然后从未来获取结果.

目前我的结果如下:

+-------------------------------+----+---------------------+
| title                         | id | published_at        |
+----------------------------------------------------------|
| Hello world                   |  1 | 2015-01-06 12:21:16 |
| 20+ Tools For RoR Development |  2 | 2015-08-25 12:21:23 |
| Angular JS tutorial           |  3 | 2015-09-31 10:51:55 |
| Visual search                 |  4 | 2015-03-12 12:27:26 |
| Ruby on Rails best practices  |  5 | 2015-01-21 00:00:00 |
+-------------------------------+----+---------------------+  
Run Code Online (Sandbox Code Playgroud)

而我期望的结果将是:

+-------------------------------+----+---------------------+
| title                         | id | published_at        |
+----------------------------------------------------------|
| 20+ Tools For RoR Development |  2 | 2015-08-25 12:21:23 |
| Hello world                   |  1 | 2015-01-06 12:21:16 |
| Ruby on Rails best practices  |  5 | 2015-01-21 00:00:00 |
| Visual search                 |  4 | 2015-03-12 12:27:26 |
| Angular JS tutorial           |  3 | 2015-09-31 10:51:55 |
+-------------------------------+----+---------------------+
Run Code Online (Sandbox Code Playgroud)

小智 6

不使用UNION/CASE的解决方案

SELECT * FROM posts
ORDER BY
    DATE(published_at)=DATE(NOW()) DESC,
    DATE(published_at)<DATE(NOW()) DESC,
    DATE(published_at)>DATE(NOW()) ASC`
Run Code Online (Sandbox Code Playgroud)

检查这是否有效.它与受刺激的数据一起工作正常.您可以根据过去和未来日期的排序要求将desc更改为asc