代码之家  ›  专栏  ›  技术社区  ›  simnom

mysql-在所有日期出现的日期之间搜索

  •  3
  • simnom  · 技术社区  · 15 年前

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

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

    用户可以在一个日期范围内搜索,搜索需要返回在这两个日期之间可用的相关房间。

    换句话说,使用SQL查询进行搜索:

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

    这还不够,因为这会在选定日期之间的某个时间点恢复所有可用房间,而不是恢复所有相关日期可用的房间。

    我正在考虑以某种方式使用一个临时日期表来交叉引用,范围内的每个日期都有一个条目,但是对于实现这一点的最佳方法还不确定。

    最终代码平台是PHP,我还在研究数据是否可以随后在代码中处理,但如果可能的话,我希望将所有内容都保存在SQL中。

    如有任何建议,我们将不胜感激。

    谢谢

    2 回复  |  直到 12 年前
        1
  •  4
  •   Mark Byers    15 年前

    更新:我的原始答案和Quassnoi的完全相同,但是晚了1分钟,所以我决定删除它并做一些不同的事情。此查询不假定(ID、日期)是唯一的。如果有多个条目,则选择最便宜的。此外,它还总结了总成本和总回报,这也可能是有用的。

    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
    
        2
  •  3
  •   Quassnoi    15 年前

    如果提供 (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 约束 (身份证,日期) 以及 date 存储为 DATE 不是 DATETIME .