我有这三张桌子:
酒店 |
---|
酒店_id |
酒店名称 |
房间 |
---|
房间_id |
酒店_id |
房间价格 |
---|
房间_id |
日期 |
价格 |
我知道如何查询数据库来获取给定 room_id 和给定酒店住宿日期的价格。所以我可以做到这一点,但是,当涉及到在很长的日期范围内执行此操作时,这变得不切实际。
您可以动态创建日期系列,如 Bagus Tesa 建议的 答案 所示,或者维护日历表。鉴于日期在预订/预订应用程序中发挥着重要作用,我建议创建一个简单的日历表。
在本例中,我使用的日历表只有一个 dt (
DATE
) 列,您可以轻松地使用存储过程(或您选择的任何其他方法)填充该列:
CREATE TABLE calendar (dt DATE NOT NULL PRIMARY KEY);
DELIMITER $$
CREATE PROCEDURE `filldates`(dateStart DATE, dateEnd DATE)
BEGIN
WHILE dateStart <= dateEnd DO
INSERT INTO calendar (dt) VALUES (dateStart);
SET dateStart = dateStart + INTERVAL 1 DAY;
END WHILE;
END$$
DELIMITER ;
CALL filldates('2023-01-01', '2039-12-31');
然后是预订日期和房间日期之间的
CROSS JOIN
的简单情况,以及用于检索每天每间房间的价格的相关子查询:
SET @checkin = '2023-11-26', @checkout = '2023-12-15';
SELECT r.room_id, COUNT(*) AS nights, (
SELECT price
FROM room_price
WHERE room_id = r.room_id
AND start_date <= c.dt
ORDER BY start_date DESC
LIMIT 1
) AS price
FROM calendar c
CROSS JOIN room r
WHERE c.dt >= @checkin AND c.dt < @checkout
GROUP BY room_id, price;
注意:虽然关键字
CROSS
在MySQL中没有任何意义(它只是一个没有ON子句的INNER连接),但我认为它清楚地表达了意图。
这是一个db<>小提琴。