【问题标题】:Hotel Booking Calendar Reservation logic issue酒店预订日历预订逻辑问题
【发布时间】:2015-11-09 20:01:12
【问题描述】:

我正在尝试设置酒店预订系统,但遇到了问题。我们正试图找到在多天和多月内可以使用房间的地方。以下是我们目前使用的四个查询,但是管理员不能提前预订,直到一个房间没有活动。任何帮助都会很棒。

$sql_statementxf1 = "Select * FROM Hotels 
  WHERE EXISTS (
    Select * FROM cal_events 
    WHERE start_date >= $end_dated 
    AND cal_events.HotelID = Hotels.HotelID 
    ORDER BY start_date) 
  AND HotelID>0 
  AND Class != 'HO' 
  ORDER BY HotelBlock, HotelNumber";
$sql_statementxf = "Select * FROM Hotels 
  WHERE EXISTS (
    Select * FROM cal_events 
    WHERE end_date >= $start_dated  
    AND cal_events.HotelID = Hotels.HotelID)  
  AND NOT EXISTS ( 
    select * from cal_events  
    WHERE start_date=$start_dated  
    AND cal_events.HotelID = Hotels.HotelID)  
  AND HotelID>0 
  AND Class != 'HO'
  ORDER BY HotelBlock, HotelNumber"; 
$sql_statementxf2 = "Select * FROM Hotels 
  WHERE NOT EXISTS ( 
    Select * FROM cal_events  
    WHERE cal_events.HotelID = Hotels.HotelID)  
  AND HotelID>0 
  AND Class != 'HO' 
  ORDER BY HotelBlock, HotelNumber";
$sql_statementxf3 = "Select * FROM Hotels 
  WHERE EXISTS ( 
    Select * FROM cal_events  
    WHERE start_date=$start_dated  
    AND end_date = $end_dated  
    AND CustomerID = $custid  
    AND PersonID != $personid  
    AND cal_events.HotelID = Hotels.HotelID)  
  AND HotelID>0 
  AND Class!='HO' 
  ORDER BY HotelBlock, HotelNumber";

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    这段代码中有很多谜团(比如为什么变量名似乎与它们的使用方式不匹配),但有一点很突出,$sql_statementxf2 与其他部分不同。 Xf、XF1 和 XF3 都非常注意日期。 XF2 完全忽略日期,并排除所有具有任何日历事件的酒店。这听起来像您所描述的问题行为,因为这是它所做的唯一事情,我会说评论它,看看是否能得到您正在寻找的结果。

    稍微偏离问题,您似乎正在尝试为您提供的范围查找没有日历条目的房间。我不确定你是如何组合前三个语句的,但是它们都可以用一个简单的 or 语句来代替:

      select Hotels.* from Hotels
      where not exists 
      (
        select * from cal_events 
        where cal_events.HotelID = Hotels.HotelID
          and (cal_events.start_date between $start_Date and $End_Date
            or cal_events.end_date between $start_Date and $End_Date
            or (cal_events.start_date < $start_Date and cal_events.end_date > $End_date))
        )
          AND HotelID>0 
          AND Class != 'HO' 
      ORDER BY HotelBlock, HotelNumber
    

    它的作用是排除三种类型的重叠日期范围,不显示活动在此期间开始的房间,不显示活动在此期间结束的房间,也不显示有活动的房间在期间之前和之后开始和结束(完全重叠)。最后一个看起来您正在努力避免客户重复预订,因此该部分可能会保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多