Сортировка событий в MySQL по дате начала и / или окончания - PullRequest
1 голос
/ 25 марта 2020

У меня есть следующая начальная позиция:

В таблице есть события с начальной и конечной датой.

Я бы хотел отсортировать эти события в запросе по следующим параметрам:

текущие события> будущие события> завершенные события

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

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете попробовать эту логику c:

SELECT
    startAt,
    endAt
FROM events
ORDER BY
    CASE WHEN startAt < CURDATE() THEN endAt ELSE startAt END;

Лог c указанного выше условия ORDER BY состоит в том, что если дата начала события строго меньше, чем прямо сейчас, то это означает, что что событие либо выполняется, либо полностью завершено, и в этом случае мы сортируем его по значению endAt. В противном случае мы сортируем, используя startAt.

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

SELECT startAt, endAt
FROM events
ORDER BY
    CASE WHEN endAt > CURDATE() AND startAt < CURDATE() THEN 0
         WHEN endAt > CURDATE() AND startAt > CURDATE() THEN 1
         ELSE 2 END,
    CASE WHEN startAt < CURDATE() THEN endAt ELSE startAt END;
0 голосов
/ 25 марта 2020
Try case statement to select he date for order.

  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
      CASE
          WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN endAt
          WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) > DATE(NOW()) THEN startAt
      ELSE endAt
      END DESC
...