Я разрабатываю систему бронирования номеров в отелях.
Эта система будет содержать некоторое количество отелей, номеров и категорий номеров.У меня уже есть таблицы для этих вещей.
В настоящий момент мне нужно создать запрос, чтобы получить количество доступных номеров для каждой категории номеров на указанные даты.
Таблица моих номеров выглядит следующим образом:
--------------------------------------------
| id | name | hotel_id |room_category_id|
--------------------------------------------
| 1 | Room #1 | 1 | 1 |
| 2 | Room #2 | 1 | 1 |
| 3 | Room #3 | 1 | 2 |
| 4 | Room #4 | 1 | 2 |
| 5 | Room #5 | 1 | 3 |
| 6 | Room #6 | 1 | 3 |
| 7 | Room #7 | 1 | 4 |
| 8 | Room #8 | 1 | 4 |
--------------------------------------------
Таблица категорий номеров выглядит следующим образом:
----------------------------------
| id | name | price | volume |
----------------------------------
| 1 | Standart | $100 | 2 |
| 2 | Comfort | $150 | 2 |
| 3 | Half Lux | $200 | 3 |
| 4 | Lux | $250 | 3 |
----------------------------------
Таблица бронирования выглядит следующим образом:
------------------------------------------------------------------------
| id | booking_start | booking_end | room_id |room_category_id|hotel_id|
------------------------------------------------------------------------
| 1 | 2019-06-17 | 2019-07-17 | 1 | 1 | 1 |
| 2 | 2019-06-17 | 2019-07-17 | null | 2 | 1 |
| 3 | 2019-06-17 | 2019-07-17 | null | 3 | 1 |
------------------------------------------------------------------------
Iпытаюсь ответить на этот запрос
SELECT room_categories.name, COUNT(room_categories.name) as quantity FROM rooms
INNER JOIN room_categories
ON rooms.room_category_id = room_categories.id
WHERE hotel_id=1
AND room_categories.id NOT IN (
Select bookings.room_category_id FROM bookings
WHERE '2019-07-28' between booking_start and booking_end
OR booking_end between '2019-06-17' and '2019-07-28'
OR '2019-06-17' between booking_start and booking_end
OR booking_start between '2019-06-17' and '2019-07-28'
)
GROUP BY room_categories.name
ORDER BY quantity
Давайте представим, что у меня есть 2 номера для каждой категории и 1 бронирование для каждой категории номеров.Этот запрос возвращает ТОЛЬКО категорию. У меня нет ЛЮБЫХ бронирований (в моем случае room_category = 4).
-------------------
| name |quantity|
-------------------
|Standart| 2 |
-------------------
Как мне построить запрос дляполучить правильный счет здесь, как это:
|room_category|count|
---------------------
| Standart | 1 |
| Comfort | 1 |
| Half Lux | 1 |
| Lux | 2 |
---------------------