Поле Order By on date, начинающееся в средней точке диапазона дат - PullRequest
3 голосов
/ 24 марта 2012

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

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

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

Я хотел бы получить, имея в качестве даты начала "march-22", такой результат:

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

В одном запросе, потому что я делаю это с двумя из них, и он медленный, потому что единственная разница - сортировка, и объединения, которые я должен сделать, немного "тяжелые".

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Вы можете использовать что-то вроде этого -

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 голосов
/ 24 марта 2012

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

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

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

0 голосов
/ 24 марта 2012

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

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

Это должно сработать. Я не уверен на 100% в добавлении заказа в СОЮЗ ...

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