У меня есть следующая начальная позиция:
В таблице есть события с начальной и конечной датой.
Я бы хотел отсортировать эти события в запросе по следующим параметрам:
текущие события> будущие события> завершенные события
SELECT
startAt,
endAt,
(
CASE
WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN 1
WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) > DATE(NOW()) THEN 0
ELSE -1
END
) as position
FROM
events
ORDER BY
position DESC
Теперь проблема:
Сортировка по трем категориям работает с вышеуказанным запросом, но в пределах категорий должны применяться следующие сортировки:
Текущие события (отсортированные по дате окончания)> Будущие события (отсортированные по дате начала)> завершенные события (отсортированные по дате окончания)
Итак, сначала все текущие события, срок действия которых истекает в ближайшее время, будут поступать в порядке убывания (т. е. имеют больше времени, чем предыдущие), затем все будущие события, которые скоро начнутся в порядке убывания (т.е. начать позже, чем предыдущие), а затем все завершенные события в порядке убывания.
РЕШЕНО с помощью @Tim Biegeleisen
SELECT
startAt,
endAt
FROM
events
ORDER BY
(
CASE
WHEN endAt > CURDATE() AND startAt < CURDATE() THEN 1
WHEN endAt > CURDATE() AND startAt > CURDATE() THEN 0
ELSE -1
END
) DESC,
(
CASE
WHEN startAt < CURDATE() THEN endAt
ELSE startAt
END
) ASC