двойная сортировка в Mysql

251
07 октября 2017, 21:50

Есть таблица с разными данными включая поле starts(datetime). Мне нужна такая сортировка что:
если starts > NOW() тогда order by starts ASC
и если starts < NOW() тогда order by starts DESC

На данный момент я пользуюсь тем что в php делаю два запроса и объединяю их.
Может есть какое нибудь решения который позволит сделать в один запрос?
Мои запросы:
select * from table where starts > now() order by starts ASC select * from table where starts < now() order by starts DESC
И объединяю две это результаты в php array_merge($query, $query2)
В этом случае я не могу систему страниц данных и разбить результат в несколько страниц



Многие тут советуют использовать сортировку с дополнительный полем типа if(starts > NOW(), 1, -1) AS 'sort' и в конце order by sort DESC
Я уже пробовал такое но я получу плохую сортировку например:

id | starts 1 | 03,11,2017 2 | 04,11,2017 3 | 02,11,2017 4 | 02,09,2017 5 | 04,09,2017 6 | 03,09,2017
Обратите внимание на даты, прошедшие даты конечно оказались внизу но они не отсортированы по убыванию. А предстоящие даты не отсортированы по возрастанию

Answer 1
ORDER BY starts > now() /* ASC or DESC */,
         CASE WHEN starts > now() THEN 0 + starts 
                                  ELSE 0 - starts 
         END ASC
Answer 2
select *
  from table
 order by if(starts > now(), 1, -1) * to_seconds(starts)

Хотя если следовать логике, что сначала должны быть именно те, что больше по возрастанию, а потом остальные по убыванию, то сортировка скорее такая:

order by (starts <= now()), if(starts > now(), 1, -1) * to_seconds(starts)
Answer 3
SELECT
  starts,
  CASE 
   WHEN starts > NOW() THEN -1 * UNIX_TIMESTAMP(starts)
   WHEN starts <= NOW() THEN UNIX_TIMESTAMP(starts) END as sort
FROM
  table
ORDER BY sort DESC;
READ ALSO
как проверить существует ли файл по url?

как проверить существует ли файл по url?

как можна с помощю php проверить существует ли файл по url например: если файл http://minionomaniyaru/wp-content/uploads/2016/01/%D0%9A%D0%B5%D0%B2%D0%B8%D0%BD

321
Сравнить и объединить два .txt файла

Сравнить и объединить два .txt файла

Есть дваtxt файла, в каждом по 3000 строк, следующего содержания:

293
Как передать в Mysql &lt;&gt;нескольким числам?

Как передать в Mysql <>нескольким числам?

Нужно обновить все поля mark на 0, кроме $checkboxId (5,6 и тд которые приходят)<> работает только с 1 числом

223
Вывод кнопок из базы (Telegram API)

Вывод кнопок из базы (Telegram API)

Привет всемКак можно реализовать следующее?

274