MySQL - Ежедневный обзор показывает только текущие бронирования, а не все - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь получить представление, в котором я могу выбрать определенный c день, и он вернет список ВСЕХ комнат с разбивкой по текущим дням.

В настоящее время отображается ежедневный обзор для указать c день, но в нем нет номеров, в которых НЕ зарезервированы номера на выбранный день?

(мне нужно отобразить ежедневный обзор для всех номеров, даже без заказов)

Как изменить это таким образом, он покажет ВСЕ номера, даже если нет бронирования для указанного номера c в этот день, а также номеров, которые это делают?

Текущий показ (для 2019-11- 24):

SELECT * FROM `Daily Overview` WHERE '2019-11-24' >= StartDate AND '2019-11-24' <= EndDate;

3   Family  2   2019-11-24  2019-11-28  4   2   2,3 Ahri,Blitz
4   Dual    1   2019-11-22  2019-11-25  2   1   1   Aatrox

Желаемый вывод:

1
2
3   Family  2   2019-11-24  2019-11-28  4   2   2,3 Ahri,Blitz
4   Dual    1   2019-11-22  2019-11-25  2   1   1   Aatrox
5
6
8
9
10

Просмотр сценария:

CREATE VIEW `Daily Overview` AS
SELECT ROOMINFO.ID as Room, ROOMINFO.`Type`,
    BOOKROOM.Ref as Ref,
    BOOK.Start_Date as StartDate,
    BOOK.End_Date as EndDate
FROM ROOMINFO
JOIN BOOKROOM ON ROOMINFO.ID = BOOKROOM.ID
JOIN BOOK ON ROOMINFO.ID AND BOOK.Ref = BOOKROOM.Ref
GROUP BY ROOMINFO.ID, ROOMINFO.`Type`, ROOMINFO.Max, Ref;

скрипт таблицы и структура данных:

CREATE SCHEMA CATTERY2;
USE CATTERY2;

CREATE TABLE BOOK( Ref INT NOT NULL AUTO_INCREMENT, Start_Date DATE NOT NULL, End_Date DATE NOT NULL, PRIMARY KEY(Ref));
CREATE TABLE ROOMINFO( ID INT NOT NULL AUTO_INCREMENT,`Type` VARCHAR(10) NOT NULL, Max TINYINT NOT NULL, PRIMARY KEY(ID));
CREATE TABLE BOOKROOM( Ref INT NOT NULL, ID INT NOT NULL, FOREIGN KEY (Ref) REFERENCES BOOK(Ref), FOREIGN KEY (ID) REFERENCES ROOMINFO(ID));

INSERT INTO BOOK(Start_Date, End_Date) VALUES   
("2019-11-22", "2019-11-25"), ("2019-11-24", "2019-11-28");

INSERT INTO ROOMINFO (ID, `Type`,Max) VALUES
(1, "Family", 4), (2, "Family", 4), (3, "Family", 4), (4, "Dual", 2),
(5, "Dual", 2),   (6, "Dual", 2), (7, "Dual", 2),   (8, "Dual", 2),
(9, "Dual", 2),   (10, "Dual", 2);

INSERT INTO BOOKROOM( Ref, ID ) VALUES
    (1, 4), (2, 3);

1 Ответ

0 голосов
/ 18 апреля 2020

Учтите следующее. Обратите внимание, что я немного изменил вашу структуру, чтобы помочь пониманию:

DROP SCHEMA IF EXISTS cattery2;

CREATE SCHEMA CATTERY2;
USE CATTERY2;

CREATE TABLE cats
(cat_id SERIAL PRIMARY KEY
,name VARCHAR(30) 
,sex CHAR(1) NOT NULL
);

CREATE TABLE bookings
(booking_id SERIAL PRIMARY KEY
,start_Date DATE NOT NULL
,end_date DATE NOT NULL
);

CREATE TABLE rooms
(room_id SERIAL PRIMARY KEY
,capacity TINYINT NOT NULL
);

CREATE TABLE room_booking
(room_id INT NOT NULL
,booking_id INT NOT NULL
,PRIMARY KEY(room_id,booking_id)
);

CREATE TABLE cat_booking
(cat_id INT NOT NULL
,booking_id INT NOT NULL
,PRIMARY KEY(cat_id,booking_id)
);  

INSERT INTO bookings(start_date, end_date) VALUES   
("2019-11-22", "2019-11-25"), 
("2019-11-24", "2019-11-28"), 
("2019-12-01", "2019-12-02"), 
("2019-12-01", "2019-12-06"),
("2019-12-02", "2019-12-03"), 
("2019-12-04", "2019-12-10"), 
("2019-12-04", "2019-12-10"), 
("2019-12-05", "2019-12-13"),
("2019-12-16", "2019-12-19"), 
("2019-12-26", "2019-12-28"), 
("2019-12-26", "2020-01-01"), 
("2019-12-28", "2020-01-02"),
("2019-12-31", "2020-01-05"), 
("2020-01-03", "2020-01-08"), 
("2020-01-05", "2020-01-11"), 
("2020-01-06", "2020-01-09"),
("2020-01-06", "2020-01-11"), 
("2020-01-08", "2020-01-18"), 
("2020-01-11", "2020-01-15"), 
("2020-01-15", "2020-01-17"),
("2020-01-15", "2020-01-18");

INSERT INTO rooms (room_id,capacity) VALUES
( 1,4), 
( 2,4), 
( 3,4), 
( 4,2),
( 5,2),   
( 6,2), 
( 7,2),   
( 8,2),
( 9,2),
(10,2);

INSERT INTO room_booking (booking_id,room_id) VALUES
( 1,  4), 
( 2,  3), 
( 3,  4), 
( 4,  5),
( 5,  6), 
( 6,  7), 
( 7,  3), 
( 8,  2),
( 9,  1), 
(10,  8), 
(11,  3),
(12,  9),
(13,  2),
(14, 10), 
(15,  4),
(16,  5),
(17,  6),
(18,  7),
(19,  2),
(20,  1),
(21, 10);

INSERT INTO cats (name,sex) VALUES
('Aatrox', 'm'), 
('Ahri', 'f'), 
('Blitz', 'm'), 
('Curley', 'm'),
('Mandy', 'm'), 
('Nami', 'f'), 
('Kog', 'm'), 
('Caitlyn', 'f'),
('Barney', 'm'), 
('Gnar', 'm'), 
('Charley', 'f'), 
('Bundy', 'm'),
('Ringo', 'm'), 
('Smiley', 'm'), 
('Bentley', 'f'), 
('Barney', 'm'),
('Yuumi', 'f'), 
('Rammus', 'm'), 
('Viktor', 'm'), 
('Xerath', 'm'),
('Azir', 'm'), 
('Reginald', 'm'), 
('Harry', 'm'), 
('Indie', 'f'),
('Dotty', 'f'), 
('Wesley', 'm'), 
('Karma', 'f'), 
('Nami', 'f'),
('Nautalus', 'm'), 
('Tristy', 'f'), 
('Kaisa', 'f'), 
('Baron', 'm'),
('Braum', 'm'), 
('Alistar', 'm'), 
('Ahri', 'f');

INSERT INTO cat_booking(booking_id,cat_id) VALUES
 ( 1,  1), 
 ( 2,  2), 
 ( 2,  3), 
 ( 3,  1),
 ( 4,  2), 
 ( 5,  3), 
 ( 5,  4), 
 ( 6,  5),
 ( 7,  6), 
 ( 7,  7),  
 ( 7,  8), 
 ( 8,  9),
 ( 8, 10), 
 ( 8, 11), 
 ( 9, 12), 
 ( 9, 13),
 ( 9, 14), 
 (10, 15), 
 (11, 16), 
 (11, 17),
 (11, 18), 
 (12, 19), 
 (12, 20), 
 (13, 21),
 (13, 22), 
 (13, 23), 
 (14, 24), 
 (14, 25),
 (15, 26), 
 (16, 27), 
 (16, 28), 
 (17, 29),
 (18, 30), 
 (19, 31), 
 (19, 32), 
 (20, 33),
 (20, 34), 
 (21, 35);

И запрос ...

SELECT DISTINCT r.room_id
              , r.capacity
              , x.booking_id
              , x.start_date
              , x.end_date
           FROM rooms r 
           LEFT
           JOIN 
              ( SELECT b.booking_id
                     , b.start_date
                     , b.end_date
                     , rb.room_id
                  FROM bookings b
                  JOIN room_booking rb 
                    ON rb.booking_id = b.booking_id
                 WHERE '2019-11-24' BETWEEN b.start_date AND b.end_date
              ) x
             ON x.room_id = r.room_id
          ORDER
             BY r.room_id
              , r.capacity
              , x.start_date
              , x.booking_id;

   +---------+----------+------------+------------+------------+
   | room_id | capacity | booking_id | start_date | end_date   |
   +---------+----------+------------+------------+------------+
   |       1 |        4 |       NULL | NULL       | NULL       |
   |       2 |        4 |       NULL | NULL       | NULL       |
   |       3 |        4 |          2 | 2019-11-24 | 2019-11-28 |
   |       4 |        2 |          1 | 2019-11-22 | 2019-11-25 |
   |       5 |        2 |       NULL | NULL       | NULL       |
   |       6 |        2 |       NULL | NULL       | NULL       |
   |       7 |        2 |       NULL | NULL       | NULL       |
   |       8 |        2 |       NULL | NULL       | NULL       |
   |       9 |        2 |       NULL | NULL       | NULL       |
   |      10 |        2 |       NULL | NULL       | NULL       |
   +---------+----------+------------+------------+------------+

Также обратите внимание, что здесь нет VIEW. Это намеренно. Запросы к VIEWS в MySQL имеют ограниченный доступ к базовым индексам, что делает их (в моем VIEW) практически бесполезными.

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