如何检查MySQL预订数据库中的可用性块?

时间:2014-05-07 07:47:49

标签: php mysql arrays search multidimensional-array

我有一个住宿预订引擎,遵循以下规则:

  • 用户可以预订任意日期的7个房间。
  • 用户必须只预订2天,4天和6天的区块。
  • 用户无法在星期四预订(因清洁而关闭)。
  • 由于公司团体预订,有时整整一周都无法使用。

以下是一些例子:

  • 2天的街区可能是周五和周六,周日和周一,周二和周三。
  • 4天的街区可能是周五至周一或周日至周三。
  • 6天的街区可能是星期五到星期三。

系统在数据库中有一个简单的表,它是7个房间的每个日期的列表。每个房间的字段可以是0表示不可用,或者1表示可用。

表名为vg_booking_availability。这是一张快照。

vg_booking_availability database table snapshot

我需要一种方法来针对用户搜索选择搜索表格。

可能会搜索2,4或几天以及1到7个房间的任意组合。

我不确定解决方案是在所有日期和所有房间进行数据库查找,然后创建多维数组并使用用户搜索进行交叉检查是前进的方法。如果是这样的话呢?

1 个答案:

答案 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对此很好)并确保你可以获得所需的性能。