酒店预订日历预订逻辑问题

时间:2015-11-09 20:01:12

标签: php mysql sql

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

$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";

1 个答案:

答案 0 :(得分:1)

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

稍微偏离问题,看起来你想要做的就是找到没有日历条目的房间。我不确定你是如何组合前三个语句的,但是它们都可以用一个简单或声明来代替:

  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

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