Получить номер на две даты, когда есть несколько категорий в одном бронировании - PullRequest
0 голосов
/ 08 февраля 2019

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

У меня 3 таблицы:

забронированный номер

    create table reservedRoom (
bookingID int ,
roomID int NOT NULL,
n_person int,
)



bookingID   roomID  n_person
2            1          2
2            2          2
2            3          3
2            4          3
2            5          3

номер

create table room (
roomID int NOT NULL PRIMARY KEY,
descriptions int NOT NULL,
rate int,
category varchar(30),
)
roomID  descriptions    rate    category
1              2        2000    standard
2              2        2000    standard
3              2        2000    standard
4              2        2000    standard
5              2        2000    standard
6              2        2000    standard
7              2        2000    standard
8              2        2000    standard
9              2        2500    quad
10             2        2500    quad
11             2        2500    quad
12             2        2500    quad
13             2        2500    quad
14             2        3000    family
15             2        3000    family
16             2        3000    family
17             2        3000    family
18             2        8000    King
19             2        8000    King
20             2        8000    King

Бронирование

create table bookings (
bookingID int NOT NULL PRIMARY KEY,
clientID int NOT NULL,
checkIndate DATETIME,
checkOutDate DATETIME,
roomsCount int,
numNights int,
bookExpire DATETIME,
)

   bookingID    clientID    checkIndate checkOutDate    roomsCount  numNights   bookExpire
1                 1        2018-02-08   2018-02-09      3             2     2018-02-11 
2                 2        2018-02-08   2018-02-09      5             2     2018-02-11 
3                 3        2018-02-08   2018-02-09      3             2     2018-02-11 
4                 4        2018-02-08   2018-02-09      3             2     2018-02-11 
5                 5        2018-02-08   2018-02-09      3             2     2018-02-11 

Я попробовал этот код, но я не знаю, что делать дальше.

 $availableRooms = booking::where(function($query) use ($checkInDate_1, $checkOutDate_1)
                {
                  $query->where(function($query) use ($checkInDate_1, $checkOutDate_1){
                      $query->whereDate('bookings.checkOutDate', '>=', $checkInDate_1);
                      $query->whereDate('bookings.checkOutDate', '<=', $checkOutDate_1);
                  });
                })
              ->whereDate('bookings.bookExpire', '>',$checkOutDate_1)
              ->get();

Моя проблема заключается в том, как мне сгруппировать номера по bookingID и интегрировать эту группу в запрос, чтобы получить номера нарегистрация и проверка.

Желаемый результат на дату 2018-02-08 - 2018-02-09

standard room - 3 Rooms available
quad room - 5 rooms available
family room - 4 rooms available
king room - 3 rooms available

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вам просто нужен простой запрос пересечения диапазона.Это должно сделать это:

SELECT category, COUNT(*)
FROM room
WHERE NOT EXISTS (
    -- room is booked on the requested dates (...not)
    SELECT 1
    FROM reservedRoom
    JOIN bookings ON reservedRoom.bookingID = bookings.bookingID
    WHERE reservedRoom.roomID = room.roomID
    AND '2018-02-09' > checkIndate
    AND '2018-02-08' < checkOutDate
)
GROUP BY category
0 голосов
/ 08 февраля 2019

Ваш запрос sql будет

select r.category, count(*) as [count]
from room as r
    left join reservedRoom as rr
        on r.roomID = rr.roomID
    left join bookings as b
        on rr.bookingID = b.bookingID
            and ((b.checkIndate >= @DateFrom and b.checkIndate < @DateTo)
                or (b.checkOutDate > @DateFrom and b.checkOutDate <= @DateTo)
            )
where b.bookingID is null
group by r.category
0 голосов
/ 08 февраля 2019

Вот пример того, как выполнить запрос

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

После этого вычтите значениепо категориям с общим количеством комнат, сгруппированных по категориям из таблицы комнат

   select x.category
          ,count(x.roomId) - case when isnull(max(booked_rooms.cnt))=1 then
                                       0
                                  else max(booked_rooms.cnt)
                                  end as available_rooms
     from room x
left join ( select c.category /* Find out the rooms bny category which are booked within the dates*/
                  ,count(c.roomID) as cnt
              from bookings a
              join reservedRoom b
                on a.bookingID=b.bookingID
              join room c
                on b.roomID=c.roomID
            where a.checkIndate between '2018-02-08' and '2018-02-09' 
            group by c.category
           )booked_rooms
        on x.category=booked_rooms.category
 group by x.category  

Вот ссылка на dbfiddle

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=8a91f2486bac25bda3f46b6ae3cddf8c

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