表格定義會有幫助,但在這裏。這應該適用於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