我正在尝试设置酒店预订系统并遇到问题。我们正试图在多天和几个月内找到房间的可用位置。以下是我们目前使用的四个查询,但管理员无法提前预订,直到一个房间没有活动。任何帮助都会很棒。
$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";
答案 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
它的作用是排除三种类型的重叠日期范围,不显示在此期间活动开始的房间,不显示活动在期间结束的房间,并且不显示有活动的房间在期间之前和之后开始(完全重叠)。最后一个看起来像是在试图避免客户双重预订,因此该部分可能会保留。