【问题标题】:SQL for finding free rooms during a specific time period在特定时间段内查找空闲房间的 SQL
【发布时间】:2017-01-28 18:08:20
【问题描述】:

我目前正在从事酒店预订服务,我想显示特定房间类型和酒店在特定时间段内的所有免费客房。 我发现似乎是一个有效的查询,直到我注意到:如果一个房间根本没有任何预订,它就不起作用。

SELECT DISTINCT r.id, 
            r.num, 
            r.NAME, 
            h.NAME, 
            h.city, 
            h.country 
FROM   room r 
   JOIN hotel h 
     ON r.hotel_id = h.id 
   JOIN room_type rt 
     ON r.room_type_id = rt.id 
WHERE  r.id NOT IN (SELECT room_id 
                    FROM   reservation 
                    WHERE  ( '$from' BETWEEN start_date AND end_date ) 
                        OR ( start_date BETWEEN '$from' AND '$to' ) 
                        OR '$from' = start_date) 
   AND $roomtype = rt.id 
   AND $hotel = h.id 

此查询将在 PHP 脚本中使用,其中“$from”是用户选择的预订开始日期,$to 是预订结束等。

即使房间没有预订,有没有办法让这个查询工作? 非常感谢任何帮助!

【问题讨论】:

    标签: php sql


    【解决方案1】:

    非空闲房间的逻辑是:

    • 预订在相关期间结束时或之前开始。
    • 预订在相关期间开始时或之后结束。

    有一个非免费的房间可用。让我们将此逻辑应用于您的查询:

    SELECT r.id, r.num, r.name, h.name, h.city, h.country
    FROM room r JOIN
         hotel h
         ON r.hotel_id = h.id JOIN
         room_type rt
         ON r.room_type_id = rt.id
    WHERE rt.id = $roomtype AND
          h.id = $hotel AND
          r.id NOT IN (SELECT res.room_id 
                       FROM reservation res
                       WHERE '$from' <= end_date AND
                             '$to' >= start_date AND
                      );
    

    注意:您应该在查询中为值使用参数,而不是修改查询字符串。

    【讨论】:

    • 非常感谢您这么快的回复。我应用了您的逻辑,现在它终于可以正常工作了!在子查询之前检查 rt.id 和 r.id 也很有意义。谢谢:)
    • 这不是 100% 正确的。它只会获取查询完全覆盖的预订,而不是部分覆盖的预订。
    • @Drewster 。 . .你误解了一些东西。这会发现任何重叠。
    • @GordonLinoff 我只阅读它而不是运行它,所以我可能是错的,但看起来代码会选择预订的 $to 早于或等于结束日期的任何预订预订 AND $from >= 到开始日期。这是否意味着它会错过任何 $to start_date AND $from
    • @Drewster 。 . .我认为你是对的。解释是正确的,但变量在逻辑上是倒退的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多