我有一个带有“日期”字段的表“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
在一个查询中,因为我正在使用其中两个并且它很慢,因为唯一的区别是排序,我必须做的连接有点“沉重”。
非常感谢。
答案 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
使用此功能,您可以按原样制作两个选择状态网。