【问题标题】:MySQL - Daily overview only shows current bookings rather than allMySQL - 每日概览仅显示当前预订而不是全部
【发布时间】:2020-04-18 12:17:33
【问题描述】:

我正在尝试获取可以选择特定日期的视图,它将返回包含当前日期细分的所有房间的列表。

目前它显示特定日期的每日概览,但缺少显示在所选日期没有预订的房间?

(即使没有预订,我也需要显示所有房间的每日概览)

如何更改此设置,即使当天没有预订特定房间以及预订的房间,它也会显示所有房间?

当前显示(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);

【问题讨论】:

  • 请显示您想要的输出和相应的输入,以获得最少的代表性数据和查询。 minimal reproducible example 不仅仅是一些无法满足您的需求或数十行数据的大型查询。
  • roominfo.id and book.ref = bookroom.ref 嗯?
  • 另外,使用id 作为外键会造成严重的混淆。如果您必须使用id,那么至少将外键命名为booking_idroom_id 或其他名称。否则,我们没有机会
  • 这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: mysql join select view


【解决方案1】:

考虑以下问题。请注意,我稍微修改了您的结构以帮助理解:

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。这是故意的。在 MySQL 中针对 VIEWS 的查询对底层索引的访问有限,这使得它们(在我的 VIEW 中)几乎毫无用处。

【讨论】:

  • 我明白你现在在这种情况下使用时难以理解的意思,但总的来说我需要查询的一切,感谢时间和精力:)
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
相关资源
最近更新 更多