Мероприятия могут быть однодневными или продолжающимися. Это означает, что иногда события могут длиться несколько дней, недель или месяцев.
Как и сейчас, можно отсортировать результат запроса по END в порядке возрастания (те, у которых истекает ранее, сначала показывается) или по START в ASC (события основаны на дате начала). Однако в обоих случаях у меня есть ограничения, которые я пытаюсь уменьшить настолько, насколько смогу.
При сортировке по END иногда события, которые продолжаются и уже начались, помещаются в список позже.
При сортировке по START события, которые уже начались и продолжаются, в итоге занимают первые разделы списка.
Возможно ли связать несколько операторов ORDER BY на основе логики, а не столбцов?
Например:
Получить события, срок действия которых истекает в течение следующих 7 дней:
SELECT * FROM data WHERE end < NOW() + INTERVAL 7 DAY;
Получите события, которые все еще продолжаются в течение 7 дней с сегодняшнего дня и заканчиваются в течение 14 дней:
SELECT * FROM data WHERE NOW() + INTERVAL 7 DAY >= start AND end < NOW() + INTERVAL 14 DAY;
Получить все оставшиеся события ...
SELECT * FROM data WHERE end >= NOW() + INTERVAL 14 DAY;
В принципе, возможно ли объединить их в один запрос?
SELECT * FROM data
ORDER BY (logic 1), (logic 2), (logic 3);
В качестве альтернативы я справился с выполнением 3 отдельных запросов и созданием массива результатов на стороне сервера, но хотел бы упростить мой код, если это возможно.
В надежде на то, что конечный результат всегда будет отображать список событий, срок действия которых истекает в течение 7 дней, затем событий, которые происходят в течение 7-14 дней (могут быть начатыми или продолжающимися), затем событий, которые еще продолжаются или начинаются через 14 дней с сегодняшнего дня.