【问题标题】:Finding available rooms from datespan从日期跨度查找可用房间
【发布时间】:2015-08-21 13:54:50
【问题描述】:

我有一个开始日期和一个结束日期。

 $s="YYYY-MM-DD";
 $e="YYYY-MM-DD";

我需要进行查询以检查该跨度的可用房间。

 cObjects , cBookings_details
 cObjects_id = cBookings_details_cObjects_id

我真的被困在这里,非常感谢一些帮助。

我当前的查询

 SELECT cObjects.*
FROM cObjects LEFT JOIN cBookings_details ON cObjects.cObjects_id = cBookings_details.cBookings_details_cObjects_id
WHERE cBookings_details.cBookings_details_arrival NOT BETWEEN '".$s."' AND '".$e."' 
AND cBookings_details.cBookings_details_departure NOT BETWEEN '".$s."' AND '".$e."' 
AND cBookings_details.cBookings_details_arrival <> '".$s."' AND cBookings_details_departure <> '".$s."'
AND cBookings_details.cBookings_details_arrival <> '".$e."' AND cBookings_details_departure <> '".$e."'
AND cObjects.cObjects_type < '2'

OR cBookings_details.cBookings_details_id is null AND cObjects_type < '2'

【问题讨论】:

  • 你真的没有给我们太多的继续,How to ask a good question
  • 您正在混合 orand 而没有任何 () 来强制解析顺序。首先修复它,然后查看查询是否开始运行。

标签: php mysql database database-design


【解决方案1】:

这是一个常见的问题..实际上只是在工作中为此写了一个指南:

Selecting rows with start and end dates that feature in a chosen interval 
------------------------------------------------------------------------- 

Chosen Interval -  :start_date    (S) 
                   :end_date      (E)

Rows            -  row.start_date (s)
                   row.end_date   (e)

Increasing date-->

         S       E
         |       |           Chosen Interval 

1.     s---e                 Rows we want
2.        s---e                    .
3.            s---e                .
4.     s----------e                .

5.  s--e                     Rows we don't want
6.                s--e             .

LOGIC:
row.end_date >= :start_date AND row.start_date <= :end_date   

如果您正在寻找可用房间,LEFT JOIN 使用上述逻辑进行预订的房间和SELECT 预订为NULL 的行。

应用于您的架构,我相信这会是:

   SELECT o.*
     FROM cObjects o 
LEFT JOIN cBookings_details bd
       ON bd.cBookings_details_cObjects_id = o.cObjects_id
      AND bd.cBookings_details_arrival <= :end_date
      AND bd.cBookings_details_departure >= :start_date 
    WHERE bd.cBookings_details_id IS NULL
     (AND o.cObjects_type < '2') # Double check this is what you want

顺便说一句,如果我不得不使用您的架构,我会哭的。为什么要在列中重复表名?它只会增加噪音。

【讨论】:

  • 工作就像一个魅力!谢谢!唯一的问题是,如果在 2015 年 8 月 20 日退房,我需要能够在同一天预订另一位客人进行入住。我可以通过简单地将 = 替换为 删除等号来解决这个问题吗? @Arth
  • @Martin 没问题,乐于助人!从逻辑上考虑,您正在选择发生冲突的预订,然后为相关房间打折。如果他们是在结束日期到达,是否会发生冲突?不?然后从AND bd.cBookings_details_arrival &lt;= :end_date 中删除=。如果在开始日期有出发,会有问题吗?不?然后从bd.cBookings_details_departure &gt;= :start_date 中删除另一个=。然后测试一下!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多