我有一个表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