2014-05-18 45 views
0

在排序MySQL中日期的ORDER BY时,我试图在今天之后的日期对ASC进行排序,而对于今天之前的日期,我尝试对ASC进行排序。按照IF和排序日期排序的MySQL

我在做类似的东西:

SELECT * FROM test ORDER BY IF(created >= NOW(), created, 1) ASC, created DESC 

这让我有点期望的结果:

ID CREATED 
8 May, 10 2014 11:15:00+0000 
7 May, 03 2014 20:47:00+0000 
5 May, 02 2014 14:00:00+0000 
4 April, 30 2014 17:41:00+0000 
3 April, 30 2014 17:00:00+0000 
1 April, 21 2014 03:30:00+0000 
6 March, 23 2014 12:00:00+0000 
9 May, 20 2014 20:45:00+0000 
10 July, 02 2014 20:30:00+0000 
2 June, 30 2015 11:16:00+0000 

今天之前是DESC,今天之后ASC。但是,我想在结果顶部看到ID为9,10,2的块。

任何想法如何做到这一点表示赞赏。

测试链接:http://www.sqlfiddle.com/#!2/4667b/2/0

+0

是否有任何特定的逻辑背后9,10,2顶部,因为他们是今天之后。 –

+0

只为了订购。这是为了事件。我想要显示什么是提前而不是后来,但也显示从最近传递到最古老的顺序。 – maximo

回答

1

添加一个附加条件的order by,这是该日期是否在过去或未来的二进制指标:

SELECT * 
FROM test 
ORDER BY (created >= NOW()) desc, 
     IF(created >= NOW(), created, NULL) ASC, 
     created DESC; 
+0

谢谢戈登!这个伎俩。 – maximo

0

如何分割它分成2 SQL查询,然后结合结果?

(SELECT * FROM test WHERE created >= NOW() ORDER BY created ASC) 
UNION 
(SELECT * FROM test WHERE created < NOW() ORDER BY created DESC) 
+0

来自'union'的结果没有按照子查询中的顺序进行。 “all all”的结果似乎是,但没有保证。 –