订单按日期字段从日期范围的中间点开始

时间:2012-03-24 02:09:30

标签: mysql sorting sql-order-by

我有一个带有“日期”字段的表“A”。我想进行一个选择查询并按降序排序具有先前日期的行,然后按顺序排序具有下一个日期的行,所有这些行都在同一个查询中。有可能吗?

例如,表格“A”:

id    date
---------------------
a     march-20
b     march-21
c     march-22
d     march-23
e     march-24

我希望得到这个结果:

作为开始日期“3月22日”
id    date
---------------------
c     march-22
b     march-21
a     march-20
d     march-23
e     march-24

在一个查询中,因为我正在使用其中两个并且它很慢,因为唯一的区别是排序,我必须做的连接有点“沉重”。

非常感谢。

3 个答案:

答案 0 :(得分:1)

你可以使用这样的东西 -

SELECT *
FROM test
ORDER BY IF(
    date <= '2012-03-22', 
    DATEDIFF('2000-01-01', date),
    DATEDIFF(date, '2000-01-01') 
);

以下是SQL Fiddle测试的链接 - http://sqlfiddle.com/#!2/31a3f/13

答案 1 :(得分:0)

那是错的,对不起:( 来自文档:

  

但是,对单个SELECT语句使用ORDER BY并不意味着行在最终结果中出现的顺序,因为UNION默认生成一组无序行。因此,在此上下文中使用ORDER BY通常与LIMIT结合使用,因此它用于确定要为SELECT检索的所选行的子集,即使它不一定影响这些行的顺序。最终的UNION结果。如果在SELECT中没有LIMIT出现ORDER BY,它会被优化掉,因为它无论如何都不会产生任何影响。

这应该可以解决问题。我不是100%肯定在UNION中添加订单......

SELECT * FROM A where date <= now() ORDER BY date DESC
UNION SELECT * FROM A where date > now() ORDER BY date ASC

答案 2 :(得分:0)

我认为这里真正的问题是如何加入一次。创建一个包含连接结果的临时表,并从该表中进行2次选择。因此,只有在创建(一次)而不是选择查询(两次)时才会耗费时间。

CREATE TABLE tmp SELECT ... JOIN -- do the heavy duty here

使用此功能,您可以按原样制作两个选择状态网。