【发布时间】:2017-12-20 08:55:25
【问题描述】:
我有以下理论数据库:
酒店(Hotel_No、名称、地址)
房间(Room_No、Hotel_No、类型、价格)
预订(Hotel_No、Guest_No、Date_From、Date_To、Room_No)
客人(Guest_No、姓名、地址)
粗体属性用作该表的主键。
我们的目标是找出伦敦每家酒店最常预订的房型。我脑海中的预期最终输出如下,其中Hotel_No 是伦敦一家独特酒店的 id,Type 是酒店提供的房间类型:
+----------+----------+-------+
| Hotel_No | Type | Count |
+----------+----------+-------+
| 67 | Single | 53 |
| 45 | Double | 67 |
| 32 | Double | 23 |
| ... | ... | ... |
+----------+----------+-------+
预订被计为预订表中的预订,每一行代表一个预订。
我得到的答案如下:
SELECT Type, H.hotel No
FROM Room R, Hotel H, Booking B
WHERE R.Hotel_No = H.Hotel No
AND H.Address LIKE '%London%'
AND B.Room No = R.Room_No
AND H.Hotel_No = B.Hotel_No
GROUP BY Type, H.hotel_No
HAVING Count(*) >= ALL(
SELECT Count(*)
FROM Booking B2,Room R2
WHERE B2.Hotel_No = H.Hotel_No
AND R2.Room_No = B2.Room_No
GROUP BY R2.Type);
这个解决方案正确吗?
我无法理解嵌套查询如何设法选择伦敦酒店预订的最高类型,而不是简单地返回按类型汇总的伦敦所有酒店的最高预订类型。
为什么我们在嵌套查询、B2、R2中都新建了一张表,但还是引用了原来的H表?
样本数据:
CREATE TABLE Hotel (
Hotel_No INT NOT NULL AUTO_INCREMENT,
Hotel VARCHAR(10),
Address VARCHAR(10),
PRIMARY KEY (Hotel_No)
);
CREATE TABLE Room (
Room_No INT NOT NULL,
Hotel_No INT NOT NULL,
Type ENUM('Single', 'Double', 'Family'),
PRIMARY KEY(Room_No, Hotel_No),
FOREIGN KEY(Hotel_No) REFERENCES Hotel(Hotel_No)
);
CREATE TABLE Booking (
Hotel_No INT NOT NULL,
Guest_No INT NOT NULL,
Date_From DATE NOT NULL,
Room_No INT NOT NULL,
PRIMARY KEY (Hotel_No, Guest_No, Date_From),
FOREIGN KEY (Hotel_No) REFERENCES Hotel(Hotel_No),
FOREIGN KEY (Room_No, Hotel_No) REFERENCES Room(Room_No, Hotel_No)
);
INSERT INTO Hotel (Name, Address) VALUES
('Hotel A', 'London'),
('Hotel B', 'London'),
('Hotel C', 'London'),
('Hotel D', 'Birmingham');
INSERT INTO Room VALUES
(1, 1, 'Single'),
(2, 1, 'Double'),
(1, 2, 'Single'),
(2, 2, 'Double'),
(3, 2, 'Family'),
(1, 3, 'Single'),
(2, 3, 'Double'),
(1, 4, 'Single'),
(2, 4, 'Single');
INSERT INTO Booking VALUES
(1, 1, '2000/01/01', 1),
(1, 2, '2000/02/01', 1),
(1, 3, '2000/01/01', 2),
(1, 4, '2000/02/01', 2),
(1, 5, '2000/03/01', 2),
(2, 6, '2000/01/01', 1),
(2, 7, '2000/01/01', 2),
(2, 8, '2000/01/01', 3),
(2, 9, '2000/02/01', 3),
(2, 11, '2000/01/01', 1),
(3, 12, '2000/01/01', 2),
(3, 13, '2000/02/01', 2);
【问题讨论】:
-
您如何衡量预订量?您计算的是预订量还是实际入住天数?
-
抱歉,预订是通过简单地计算在预订表中找到的行数来计算的,所以只是预订。我将编辑我的主要帖子。
-
@Olivier 如果您可以提供示例数据和表定义,我可以得到更详细的信息
-
@MKhalidJunaid 我已经创建了示例数据。请让我知道这是否足够。
-
@Olivier 我已经更新了我的答案,我希望这是有道理的