【问题标题】:How to check for blocks of availability in a MySQL booking database?如何检查 MySQL 预订数据库中的可用性块?
【发布时间】:2014-06-24 01:52:11
【问题描述】:

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

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

这里有一些例子:

  • 2 天的块可能是周五和周六、周日和周一或周二和周三。
  • 4 天的块可能是周五到周一或周日到周三。
  • 一个为期 6 天的区块可能是从周五到周三。

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

表被称为vg_booking_availability。这是一张快照。

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

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

我不确定解决方案是否是对所有日期和所有房间进行数据库查找,然后创建一个多维数组并与用户的搜索进行交叉检查是前进的方式。如果是这样,我会怎么做?

【问题讨论】:

  • 您是只搜索给定用户的输入,还是不想同时显示空闲时间列表?
  • 您好,我已经在一个非常聪明的日历上显示了空闲时间列表。需要添加功能,因此如果用户还需要一定天数和一定数量的房间,我们可以显示有哪些选项。
  • 确实@halfer 非常感谢

标签: php mysql arrays search multidimensional-array


【解决方案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 很适合这个)并确保你可以获得你需要的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2020-04-15
    相关资源
    最近更新 更多