表格定义会有帮助,但在这里。这应该适用于MS SQL Server,但一旦理解其背后的想法,将其转换为MySQL应该是一件简单的任务。
日历表只是一个标准的实用程序表,其中包含所有日期,这对您的数据库非常有用。如果你还没有一个,我建议你创建一个并填充它。
CREATE TABLE Calendar
(
date DATETIME NOT NULL,
is_holiday BIT NOT NULL,
-- any other columns that might be relevant for your business
CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED (date)
)
你会那么需要填充表,可能是有意义的为您的企业的任何日期。即使你回溯了100年,100年后,仍然不足75K行,并且它在日期中聚集在一起,所以它应该快速且容易地工作。它使得许多基于日期的查询更简单。
SELECT
P.property_id,
C.date
FROM
Calendar C
JOIN Properties P ON 1=1
WHERE
C.date BETWEEN @search_start_date AND @search_end_date AND
NOT EXISTS
(
SELECT
*
FROM
Bookings B
WHERE
B.property_id = P.property_id AND
B.start_date <= DATEADD(dy, @slot_length, C.date) AND -- You would use MySQLs date function
B.end_date >= C.date
)
或者:
SELECT
P.property_id,
C.date
FROM
Calendar C
JOIN Properties P ON 1=1
LEFT OUTER JOIN Bookings B ON
B.property_id = P.property_id AND
B.start_date <= DATEADD(dy, @slot_length, C.date) AND -- You would use MySQLs date function
B.end_date >= C.date
WHERE
C.date BETWEEN @search_start_date AND @search_end_date AND
B.booking_id IS NULL
很聪明的做法,但我需要许多其他用途的预订数据量太大。除了我目前的预订模式之外,我还可以为每个房产提供可用性表。这在某种意义上反规范化了我的数据,使得一种搜索更容易,但在这种情况下,可以算作过早的优化。 – 2009-04-23 11:59:43
您的原始预订数据仍然存在 - 它只是有一个额外的列,其中包含'预订'布尔或customerid。如果您在预订= true或客户端> 0的情况下搜索可用性表,则您的记录集与原始表中的记录集相同。这就是它将桌子大小加倍的原因,它包括预订和可用的插槽。 – 2009-04-23 12:09:35