【问题标题】:Hotel date filter: return only hotels that respect minimum stay period specified for range (SQL or Elasticsearch)酒店日期过滤器:仅返回符合为范围指定的最短停留期的酒店(SQL 或 Elasticsearch)
【发布时间】:2018-11-08 00:59:30
【问题描述】:

假设您有一个酒店数据库。每家酒店都会在数据库中创建多个价格,每个价格都有from_dateto_date。保证费率永远不会重叠。

在每个房价中,酒店经理都可以设置该期间的最短停留时间。例如,从 12 月 1 日到 1 月 30 日,最短住宿时间为 10 晚。

现在旅行者输入他的日期,例如,12 月 25 日到 1 月 1 日。在这种情况下,这家酒店应该在结果中返回,因为从 12 月 1 日到 1 月 30 日的房价规定只欢迎入住至少 10 晚。

我想不出一种查询该数据库的方法(使用 SQL 或 Elasticsearch,这是我们目前的搜索引擎),以避免返回在该日期范围内具有更高最短停留时间的酒店。

在 SQL 中,我将探索一条路径 joining 与费率表的 Hotels 表,使用 WHERE 来获取与旅行者所需日期重叠的费率(可能使用算法 (StartA <= EndB) and (EndA >= StartB)),加上一个像MAX() 这样的聚合函数来获得最大的min_stay 找到的费率,最后是一个HAVING 来指定它应该> 然后是旅行者提供的范围内存在的夜晚数。

但即使这条路对我来说也是模糊的,因为当我加入一个表格时,我会排除没有配置任何价格的酒店,这是不希望的;也许是左外连接?而如何将其转换为 elasticsearch 应该是一个更大的挑战(可能使用此处描述的存储桶聚合之类的东西 https://stackoverflow.com/a/46953947/1290457

【问题讨论】:

  • 您使用哪种方法来确定最短停留时间?留到(所有日期的最大值)还是只留到入住日期?
  • @SalmanA 所有日期的最大值。

标签: mysql sql date elasticsearch


【解决方案1】:

这里是查询的粗略大纲。它假定费率的结束日期包括在内。

SET @checkin  = '2018-12-25';
SET @checkout = '2019-01-01';
SET @date1    = @checkin;
SET @date2    = @checkout - INTERVAL 1 DAY;
SET @nights   = DATEDIFF(@checkout, @checkin);

SELECT *
FROM hotels
WHERE NOT EXISTS (
    SELECT 1
    FROM hotel_rates
    WHERE hotel_id = hotels.id
    AND @date2 >= from_date AND to_date >= @date1
    AND min_stay > @nights
)

它会检查每家酒店的房价是否与给定日期范围相交,并且要求的最低住宿天数大于晚数。

【讨论】:

  • Salman 这也是我假设的粗略轮廓,我很感激!但是您的查询不是返回hotel_ids,而不是酒店表中的酒店吗?另外,如果是这种情况,并且我们需要加入表格,那么左外连接是否是避免排除未配置任何 hotel_rates 的酒店的方法? (如果酒店经理没有告知任何hotel_rates with min stay,则酒店不应被排除在结果之外)。
  • @sandre89 我已经简化了查询。
  • 很棒的逻辑和代码,非常感谢!我已经赞成您的回答,我将等待几天,看看是否有任何关于 ElasticSearch 的解决方案。现在谢谢!
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多