我正在尝试根据用户提供的日期范围获得未预订的酒店房间。
我有两张桌子
我正在应用此查询
$sql = "SELECT DISTINCT roomno
FROM rooms
LEFT JOIN reservation ON rooms.room_id = reservation.room_id
AND
(
(
(reservation.checkindate > '$newreservcheckin')
AND
(reservation.checkindate > '$newreservcheckout')
)
OR
(
(reservation.checkoutdate < '$newreservcheckin')
AND
(reservation.checkoutdate < '$newreservcheckout')
)
)";
$ newreservcheckin 和 $ newreservcheckout 是用户提供的日期范围
假设我们的房间有房间号为100和101 现在100预订从2016年6月9日至2016年9月18日 2016年9月27日至2016年9月29日也预订了100 101室是没有保留的(意思是它在预订表中没有记录)
假设用户给出日期9-26-2016到9-30-2016查询将忽略从2016年9月27日到2016年9月29日的100号房间,但会显示房间没有100日期2016年6月9日至2016年9月18日,将显示101间客房
如何塑造查询以使其可能不会提供相同的房间而是具有不同日期的房间?
答案 0 :(得分:0)
您可以加入与新检查日期重叠的每个预订,并选择那些无法加入的房间。在我的查询中,我希望新客人可以在之前结帐的同一天登记。如果不是 - 改变“&lt;”到“&lt; =”和“&gt;”到“&gt; =”。
SELECT
r.roomno
FROM
rooms r
LEFT JOIN
reservations res ON res.room_id = r.room_id
AND res.checkindate < '$newreservcheckout'
AND res.checkoutdate > '$newreservcheckin'
WHERE res.reserv_id IS NULL
答案 1 :(得分:0)
您需要选择(A)未预订或(B)预订但超出您查询范围的房间,以下查询应该有效:
select no from room r
where not exists (
select id from reservation where room_id = r.id)
union
select no from room r
where r.id not in (
select distinct room_id from reservation
where
checkindate between '2016-09-20' and '2016-09-22'
OR
checkoutdate between '2016-09-20' and '2016-09-22'
)
这是SQL Fiddle。