2010-01-28 68 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