SELECT COUNT (свободные категории номеров в сложном запросе) - PullRequest
6 голосов
/ 14 июня 2019

Я разрабатываю систему бронирования номеров в отелях.

Эта система будет содержать некоторое количество отелей, номеров и категорий номеров.У меня уже есть таблицы для этих вещей.

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

Таблица моих номеров выглядит следующим образом:

--------------------------------------------
| 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  |
---------------------

1 Ответ

1 голос
/ 14 июня 2019

Ваш вопрос немного расплывчат в отношении того, что вы подразумеваете под "доступными" и на какие даты вы хотите.Позвольте мне предположить, что вы хотите, чтобы количество номеров по категориям было доступно за весь период с 2019 по 17-17 до 2019-07-28 (мне кажется, это давно, и в отеле есть номера для этого).весь период, кажется, не очень хороший бизнес).

SELECT rc.name,
       COUNT(b.room_id IS NULL) as quantity 
FROM rooms r JOIN
     room_categories rc
     ON rc.room_category_id = r.id LEFT JOIN
     bookings b
     ON b.room_id = r.room_id AND
        b.booking_start <= '2019-07-28' AND
        b.booking_end >= '2019-06-17'
WHERE r.hotel_id = 1
GROUP BY rc.name
ORDER BY quantity DESC;

LEFT JOIN соответствует любому бронированию, у которого было бронирование в диапазоне дат.Внешний запрос затем подсчитывает строки, которые не соответствуют .Обратите внимание, что фильтр не в предложении WHERE, поэтому вы можете получить число 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...