数据库内容如下:
mysql> select * from test;
+—-+—————–+———————+
| id | name | create_time |
+—-+—————–+———————+
| 1 | 张三 | 2018-01-10 10:47:56 |
| 2 | 李四 | 2018-01-10 11:48:15 |
| 3 | 老虎 | 2018-01-10 12:48:41 |
| 4 | 猴子 | 2018-01-11 09:49:01 |
| 5 | 大蟒蛇 | 2018-01-11 10:49:33 |
| 6 | 地狱双头犬 | 2018-01-11 10:51:37 |
| 7 | 电视机 | 2018-01-13 11:25:02 |
| 8 | 发财树 | 2018-01-12 11:25:29 |
| 9 | 咖啡杯 | 2018-01-12 16:25:40 |
+—-+—————–+———————+
9 rows in set (0.00 sec)

这个表里有9条数据,创建时间有两天的。

现在需求如下:1月11号以前的数据按id从小到大排序,1月11号之后的所有数据按id从大到小排序,然后合并两个结果集。

mysql> (select * from (select * from test where create_time > now() order by id desc limit 999) a )
-> union DISTINCT
-> (select * from (select * from test where create_time < now() order by id asc limit 999) a )
-> ;
+—-+—————–+———————+
| id | name | create_time |
+—-+—————–+———————+
| 9 | 咖啡杯 | 2018-01-12 16:25:40 |
| 8 | 发财树 | 2018-01-12 11:25:29 |
| 7 | 电视机 | 2018-01-13 11:25:02 |
| 1 | 张三 | 2018-01-10 10:47:56 |
| 2 | 李四 | 2018-01-10 11:48:15 |
| 3 | 老虎 | 2018-01-10 12:48:41 |
| 4 | 猴子 | 2018-01-11 09:49:01 |
| 5 | 大蟒蛇 | 2018-01-11 10:49:33 |
| 6 | 地狱双头犬 | 2018-01-11 10:51:37 |
+—-+—————–+———————+
9 rows in set (0.01 sec)

上面红色的的limit 999mysql5.7之后的版本都需要加上的,否则排序不会成功,5.6和之前的版本则不需要添加limit。

上面的语句中的now(),可以写的更精确,精确到年月日时分秒:“2018-01-11 12:20:58”,这样也可以。

主要办法就是用多条语句查询结果,并使用union将多个结果集合并即可。

 

发表评论