@Ilia_UA

Поиск вычисляемого значения по диапазону дат sql?

Всем здравствуйте!
Условно имеется небольшой отель с номерами на 1,2,3 места с возможностью подселения. И хочется организовать поиск по диапазону дат именно по местам, а не по номерам. Именно в подселении возникает загвоздка.
Суть: к примеру, есть заявка в 3-местный номер на 1 место с 10 по 15 июня. А потом есть заявка на 2 места с 17го по 20ое допустим. Это означает, что, допустим, в период с 9 по 21 июня в этом номере всегда будет 1 место. И при поиске по диапазону 9-21 июня этот номер должно найти. При этом, если заявки пересекаются (допустим, заявка на 2 места не с 17го, а с 14го), это означает что в хоть один день периода 9-21 номер будет полностью занят и его не будет показывать при поиске.

Я так и не понял, как мне написать такой запрос, который бы учитывал эти детали. Есть таблица со списком номеров и вместительностью, а также таблица с заявками (где указан номер заявки, номер комнаты, кол-во людей). Изначально я пробовал такой запрос:
SELECT rooms.id, rooms.size - SUM(bid.quantity) AS freeplaces from rooms,bid
    where bid.room_id = rooms.id
    and ( DATE(bid.date_start) BETWEEN DATE('2018-06-9') AND DATE('2018-06-21')
					OR DATE(bid.date_end) BETWEEN DATE('2018-06-9') AND DATE('2018-06-21') )
GROUP by bid.room_id having freeplaces >= 1

Но проблема как раз в том, что если заявки на 1 и 2 человека не пересекаются в данный период, то 1 место будет свободное в любой момент периода, а запрос посчитает сумму людей по заявкам в данном периоде (1+2=3) и скажет что мест для данного номера нет. Хотя если заявки не пересекаются, то должно искать максимальное кол-во людей в заявках, а если пересекаются - тогда уже суммировать.
Как это все организовать в рамках одного или хотя бы нескольких запросов с вложенными, я не знаю. Буду благодарен любой наводке.
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
С диапазоном дат не получится. Надо считать в цикле для каждого дня по отдельности. Создайте новую таблицу room_quantity (room_id, quantity, date), которую пересчитывайте триггером (
update room_quantity set quantity = quantity + new.quantity where date between new.date_start and new.date_end
) при изменении bid. И уже наличие свободных койко-мест ищите по этой таблице
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы