我有一个住宿预订引擎,遵循以下规则:
以下是一些例子:
系统在数据库中有一个简单的表,它是7个房间的每个日期的列表。每个房间的字段可以是0表示不可用,或者1表示可用。
表名为vg_booking_availability
。这是一张快照。
我需要一种方法来针对用户搜索选择搜索表格。
可能会搜索2,4或几天以及1到7个房间的任意组合。
我不确定解决方案是在所有日期和所有房间进行数据库查找,然后创建多维数组并使用用户搜索进行交叉检查是前进的方法。如果是这样的话呢?
答案 0 :(得分:1)
这是一种在SQL中执行此操作的方法,仅用于room_1
的两天预订:
SELECT
avail1.date start_date,
"room_1" room_name
FROM vg_booking_availability avail1
/* This row is the next day to the first one */
INNER JOIN vg_booking_availability avail2 ON (avail1.date + 1 = avail2.date)
WHERE
avail1.room_1 = 0
AND avail2.room_1 = 0
/* Add in a clause to check future dates only here */
;
您可以将此处的所有会议室添加为括号OR
语句,但我倾向于将其作为单独的查询运行(否则您必须在PHP中重新搜索结果以确定哪个房间返回可用)
我们在这里遇到了一些麻烦,因为所有房间都是非规范化的 - 他们在另一张桌子上会更好,他们可以更普遍地对待它们。
可以通过分别为4天和7天搜索添加更多别名行来扩展此示例。周四(或其他任何规则)的房间不可用与问题没有直接关系,因为您可以创建未来的可用行(基于未来人们预订的距离),然后根据这些规则使房间不可用。这是一个单独的(也是微不足道的)问题。
我也倾向于改变这一点,因此您使用NULL
作为可用,并将客户表的外键用作不可用。然后,这将为您提供有关为什么房间不可用的有用信息,并允许您在特定客户取消预订时轻松再次使用。
最后,此解决方案具有大量连接的能力,因此对数据集进行测试至关重要。如果你在10K行表上运行它就没问题,但如果你有1M行(当然,这取决于你的硬件和负载)可能不是这样。所以,一旦你有了这个工作,我建议你创建一个数据生成器(PHP对此很好)并确保你可以获得所需的性能。