MySQL - 搜索两个日期之间,包括所有日期

3

我正在处理一些导入的数据,这些数据存储有关特定日期上“房间”是否可用的详细信息。每个房间都有一个单独的条目来标明它可用的日期。

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

一个用户可以在日期范围内搜索,搜索需要返回在这两个日期之间可用的相关房间。
换句话说,使用SQL查询搜索:
where date>=2010-08-04 AND date<=2010-08-09
不够,因为这会带回在选择日期之间某个时间点可用的所有房间,而不是在所有相关日期上可用的房间。
我考虑以某种方式使用临时日期表来交叉引用范围内每个日期都有条目,但不确定最佳实现方式。
最终代码平台是PHP,我也正在探索是否可以在代码中随后处理数据,但如果可能的话,希望保持所有内容都在SQL中。
如有任何建议,请提出,将不胜感激。
谢谢。

表的名称是什么? - Mark Byers
2个回答

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

抱歉,这与Quassnoi的完全相同 - 我没有看到他已经发布了。 - Mark Byers
我现在已经修改了我的答案,使其不再是Quassnoi答案的重复。 - Mark Byers
WHERE子句放入子查询中可以使其更快。 - Quassnoi

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

请确保在(id, date)上有一个UNIQUE约束,并且dateDATE形式存储,而不是DATETIME


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接