使用此SELECT语句:
SELECT DISTINCT r.roomId,rt.roomTypeName,rt.roomTypeDesc,rt.roomTypePrice
FROM Room r left join RoomType rt
on r.roomTypeId=rt.roomTypeId
WHERE roomStatus='Online'
AND NOT EXISTS(
SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId
AND ('7/11/2015' BETWEEN b.checkInDate
AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate
AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate)))
order by rt.roomTypePrice
我得到了这个结果
如何计算每种房型的可用房间数量,以便我可以使用[结果]中的下拉列表来允许用户选择他们想要的数量? (与Agoda.com网站类似。)
答案 0 :(得分:1)
SELECT rt.roomTypeName, count(rt.roomTypeName)
FROM Room r left join RoomType rt
on r.roomTypeId=rt.roomTypeId
WHERE roomStatus='Online'
AND NOT EXISTS(
SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId
AND ('7/11/2015' BETWEEN b.checkInDate
AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate
AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate)))
GROUP BY rt.roomTypeName
有关GROUP BY
的更多信息:
http://www.w3schools.com/sql/sql_groupby.asp
这基本上是说'给我第1列中的每个roomTypeName
以及第2列中roomTypeName不为空的所有记录的计数'
这还不是很明显,但是使用GROUP BY
可以确保结果集“汇总”为不同的roomTypeName
值,因此计数会应用于具有该值的记录的出现次数roomTypeName
值。
答案 1 :(得分:0)
您确定房间可用性的逻辑过于复杂。如果期间开始时间少于某个预订的结束日期且期间结束时间在预订的开始日期之后,则房间不可用一段时间:
SELECT rt.roomTypeName, COUNT(*)
FROM Room r left join
RoomType rt
on r.roomTypeId = rt.roomTypeId
WHERE roomStatus = 'Online' AND
NOT EXISTS (SELECT 1
FROM Reservation b
WHERE b.roomId = r.roomId AND
'2015-11-07' < b.checkoutDate AND
'2015-11-08' >= b.checkinDate
)
GROUP BY rt.roomTypeName;
使用BETWEEN
表示重叠逻辑表示查询过于复杂,并且存在潜在的逻辑错误(在大多数情况下)。
注意:我将日期更改为ISO标准YYYY-MM-DD格式。我假设他们是在11月。