2012-03-24 2 views
3

У меня есть таблица «A» с полем «дата». Я хочу сделать запрос выбора и упорядочить строки с предыдущими датами в порядке убывания, а затем строки со следующими датами в порядке возрастания, все в одном запросе. Является ли это возможным?Сортировка по дате поля, начинающегося в средней точке диапазона дат

Например, таблицы "A":

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

Я хотел бы получить, имея в качестве даты начала "марш-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

+0

спасибо !! Оно работало завораживающе!! –

0

Это не так, извините :( Из документации:

Однако использование ORDER BY для отдельного ЗЕЬЕСТА не подразумевает ничего о том порядке, в котором строки появляются в конечном итоге из-за UNION по умолчанию производит неупорядоченный набор строк. Поэтому использование ORDER BY в этом контексте обычно связано с LIMIT, так что оно используется для определения подмножества выбранных строк для извлечения для SELECT, хотя это не обязательно влияет на порядок из этих строк в конечном результате UNION. Если ORDER BY появляется без LIMIT в SELECT, он оптимизируется, потому что он не будет иметь никакого эффекта.

Это должно сделать трюк. Я не 100% уверен, что при добавлении заказа в UNION ...

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

Я думаю, что реальный вопрос здесь в том, как сделать присоединение один раз. Создайте временную таблицу с результатом присоединения и сделайте 2 выбора из этой таблицы. Таким образом, это займет много времени только на создание (один раз), а не на выбранный запрос (дважды).

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

С помощью этого вы можете сделать две избранные statenets, как вы изначально сделали.

Смежные вопросы