У меня есть простая таблица для событий с столбцом даты. Я могу легко выбрать следующие 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 *
Хотя я могу легко проверить результат первого запроса, чтобы узнать, сколько строк было возвращено, и построить другой запрос, чтобы найти прошлые даты, если это необходимо, мне интересно узнать, есть ли способ получить эти строки в одном запросе,
Вы можете использовать несколько ключей в 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;