2010-01-28 109 views
3

我正在處理一些導入的數據,這些數據存儲關於某個「房間」是否在特定日期可用的詳細信息。每個房間都有一個可用日期的個人入口。mysql - 在所有日期出現的日期之間搜索

| id | date  | price | 
-------------------------------- 
| 1 | 2010-08-04 | 45.00 | 

用戶可以在一個日期範圍搜索和搜索需要帶回相關的客房,這兩個日期之間可用。

在使用SQL查詢換句話說搜索:

where date>=2010-08-04 AND date<=2010-08-09

是不夠的,因爲這將帶回可用的所有客房均選擇的日期沒有客房,是適用於所有的之間的某一點有關日期。

我正在考慮以某種方式使用臨時日期表來交叉引用該範圍中的每個日期都有一個條目,但是對於實現此目的的最佳方式還不確定。

最終代碼平臺是PHP,我也在探索數據是否可以在代碼中隨後處理,但是如果可能的話,想要保留所有的sql。

提出的任何建議將不勝感激。

感謝

+0

表的名稱是什麼? – 2010-01-28 17:14:59

+0

(id,date)是否唯一? – 2010-01-28 17:48:13

回答

4

更新:我原來的答案與Quassnoi的相同,但是1分鐘太晚了,所以我決定刪除它並做一些不同的事情。此查詢不假定(id,date)是唯一的。如果有多個條目,則選擇最便宜的條目。此外,它還總結了總成本和回報,這也可能是有用的。

SELECT id, SUM(price) FROM (
    SELECT id, date, MIN(price) AS price 
    FROM Table1 
    GROUP BY id, date) AS T1 
WHERE `date` BETWEEN '2010-08-05' AND '2010-08-07' 
GROUP BY id 
HAVING COUNT(*) = DATEDIFF('2010-08-07','2010-08-05') + 1 
+0

對不起,這和Quassnoi的完全一樣 - 我沒有看到他已經發布。 – 2010-01-28 17:24:10

+0

我現在改變了我的答案,以便它不只是Quassnoi答案的重複。 – 2010-01-28 17:57:22

+0

+1。將WHERE子句放入子查詢將使其更快。 – Quassnoi 2010-01-28 18:37:12

3

只要(id, date)組合是唯一的:

SELECT id 
FROM mytable 
WHERE date BETWEEN '2010-08-04' AND '2010-08-09' 
GROUP BY 
     id 
HAVING COUNT(*) = DATEDIFF('2010-08-09', '2010-08-04') + 1 

確保你有一個UNIQUE約束上(id, date)date存儲爲DATE,不DATETIME

+0

+1最快。 – 2010-01-28 17:36:30