У меня есть база данных, которая выглядит так:
https://i.imgur.com/dwaqUF2.png
Я хочу выбрать все номера, в которых нет бронирования на данный период времени.
Вот что я попробовал:
SELECT idRoom, type, beds FROM Room r
INNER JOIN Reservation_has_Room has on r.idRoom = has.Room_idRoom
INNER JOIN Rezervation re on has.Reservation_has_Room = re.idReservation
WHERE (re.checkIn<'2019-06-04'
AND re.checkOut<'2019-06-01')
or
(re.checkIn>'2019-06-04'
AND re.CheckOut>'2019-06-01');
Но этот скрипт возвращает номер каждый раз, когда находит резервирование, которое не совпадает с датой.
редактирование:
Думаю, меня неправильно поняли.
В этом случае:
В комнатах у меня есть эти записи:
idRoom, type, beds
'1', 'Standard', '1'
'2', 'Standard', '1'
Бронирование:
idReservation, checkIn, checkOut
'1', '2019-05-22', '2019-06-03'
'2', '2021-05-22', '2021-06-03'
'3', '2022-05-22', '2022-06-03'
Reservation_has_Room
Reservation_idReservation, Room_idRoom
'1', '1'
'2', '1'
'3', '1'
Итак, как вы можете видеть для номера № 1, у меня есть 3 бронирования. Один пересекается, а остальные нет. В этом случае скрипт из @AlexYes возвращает это:
idRoom, type, beds
'1', 'Standard', '1'
'1', 'Standard', '1'
'2', 'Standard', '1'
Так что он возвращает комнату номер один, даже два раза.
Мой ожидаемый результат:
idRoom, type, beds
'2', 'Standard', '1'
Так что доступна только комната № 2.