Выберите даты из будущего или прошлого, если будущее недоступно

0

У меня есть простая таблица для событий с столбцом даты. Я могу легко выбрать следующие n событий с (при условии n = 3):

SELECT * FROM events WHERE 'date' > NOW() ORDER BY 'date' LIMIT 3

Однако в будущем не будет трех событий. В этом случае я хотел бы вернуть те, которые доступны в будущем, и завершить то, чего не хватает с ближайшими к сегодняшнему дню. Например, если сегодня день 12-04, следующие даты, отмеченные * должны быть выбраны из всего списка:

10-03
20-03
30-03 *
10-04 *
20-04 *

Хотя я могу легко проверить результат первого запроса, чтобы узнать, сколько строк было возвращено, и построить другой запрос, чтобы найти прошлые даты, если это необходимо, мне интересно узнать, есть ли способ получить эти строки в одном запросе,

Теги:
database
date

1 ответ

2
Лучший ответ

Вы можете использовать несколько ключей в order by. Так:

SELECT e.*
FROM events
ORDER BY (date > now()) DESC,  -- future events first
         (CASE WHEN date > now() THEN date END) ASC -- nearest future events first
         date DESC  -- other dates in descending order
LIMIT 3;

Если ваш стол большой, вероятно, быстрее получить три события из ближайшего будущего и ближайшего прошлого и объединить их:

select e.*
from ((select e.*
       from events e
       where date > now()
       order by date asc
       limit 3
      ) union all
      (select e.*
       from events e
       where date <= now()
       order by date desc
       limit 3
      )
     ) e
order by date desc
limit 3;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню