SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.01.2017 15:56:47

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

сортировка по текущей дате

Знатоки, помогите составить запрос.
Есть таблица "matches":
--------------------------
id | start
--------------------------
1 | 2017-01-10 10:00:00
--------------------------
2 | 2017-01-12 20:00:00
--------------------------
3 | 2017-01-18 00:00:00
--------------------------
4 | 2017-01-20 20:00:00
--------------------------
5 | 2017-01-21 22:00:00
--------------------------
6 | 2017-01-25 22:00:00
--------------------------

Как правильно составить запрос, чтобы сначала выводились до до текущей даты по возрастанию, после по убыванию?
На ум пришел такой запрос, но в нем все либо по убыванию, либо по возрастанию:

SELECT * FROM `matches`
ORDER BY    
CASE WHEN `start` < NOW() THEN `start` END DESC

Неактивен

 

#2 20.01.2017 16:07:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: сортировка по текущей дате

сделайте 2 запроса, а результат объединяйте на клиенте
имхо, на sql это можно только через переменные и это будет плохое решение с т.з. производительности

Неактивен

 

#3 20.01.2017 16:13:13

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

Re: сортировка по текущей дате

vasya написал:

сделайте 2 запроса, а результат объединяйте на клиенте
имхо, на sql это можно только через переменные и это будет плохое решение с т.з. производительности

Дело в том, что тут и пагинатор задействовон, т.е. LIMIT 12. Надо решить одним запросом, с выводом одной таблицы.

Неактивен

 

#4 20.01.2017 16:22:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: сортировка по текущей дате

SELECT ... FROM
(SELECT 0 as i, ... FROM `matches` WHERE `start` < NOW()
UNION ALL
(SELECT @i:=@i+1 as i, ... FROM `matches`, (SELECT @i:=1) as x WHERE `start` > NOW() ORDER BY `start` DESC)) t
ORDER BY i, `start` LIMIT ..;
 

Неактивен

 

#5 20.01.2017 16:40:48

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

Re: сортировка по текущей дате

vasya, вот, - это оно!
Но у меня с этим запросом вообще мозги высохли уже. Надо наоборот, сначала после текущей даты по возрастанию, а после до текущей даты по убыванию. Что поменять в запросе?

Неактивен

 

#6 20.01.2017 16:51:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: сортировка по текущей дате

lutsk написал:

Что поменять в запросе?

стрелочки smile (знаки больше/меньше)
но лучше посмотреть статью и разобраться как это работает

Неактивен

 

#7 20.01.2017 17:00:37

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

Re: сортировка по текущей дате

vasya написал:

стрелочки (знаки больше/меньше

Да, уже понял  smile

vasya написал:

но лучше посмотреть статью и разобраться как это работает

Посмотрю, спасибо!

Отредактированно lutsk (20.01.2017 17:01:01)

Неактивен

 

#8 20.01.2017 17:18:24

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

Re: сортировка по текущей дате

Все-таки не то. Вот этот запрос

SELECT `id`, `start` FROM
(
    SELECT 0 as i, `id`, `start` FROM `matches` WHERE `start` > NOW()
    UNION ALL
    (SELECT @i:=@i+1 as i, `id`, `start` FROM `matches`, (SELECT @i:=1) as x WHERE `start` < NOW() ORDER BY `start` DESC)
) t
ORDER BY i, `start` LIMIT 12;

Выводит таблицу:
--------------------------
4 | 2017-01-20 20:00:00
--------------------------
5 | 2017-01-21 22:00:00
--------------------------
6 | 2017-01-25 22:00:00
--------------------------
1 | 2017-01-10 10:00:00
--------------------------
2 | 2017-01-12 20:00:00
--------------------------
3 | 2017-01-18 00:00:00
--------------------------

А надо:
--------------------------
4 | 2017-01-20 20:00:00
--------------------------
5 | 2017-01-21 22:00:00
--------------------------
6 | 2017-01-25 22:00:00
--------------------------
дальше

3 | 2017-01-18 00:00:00
--------------------------
2 | 2017-01-12 20:00:00
--------------------------
1 | 2017-01-10 10:00:00
--------------------------

Т.е. после текущей даты по убыванию...

Неактивен

 

#9 20.01.2017 17:38:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: сортировка по текущей дате

оптимизатор умный, удаляет сортировку, нужно так

SELECT `id`, `start` FROM
(
    SELECT 0 as i, `id`, `start` FROM `matches` WHERE `start` > NOW()
    UNION ALL
    select * from (SELECT @i:=@i+1 as i, `id`, `start` FROM `matches`, (SELECT @i:=1) as x WHERE `start` < NOW() ORDER BY `start` DESC) y
) t
ORDER BY i, `start` LIMIT 12;

Неактивен

 

#10 20.01.2017 17:42:57

lutsk
Участник
Зарегистрирован: 17.01.2013
Сообщений: 15

Re: сортировка по текущей дате

То что надо, спасибо!

P.S. Тут + в карму как поставить?

Отредактированно lutsk (20.01.2017 17:45:12)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson