用于ASP c中酒店房间可用性的SQL

时间:2015-11-20 12:54:27

标签: c# sql asp.net

我有这三个表: enter image description here

使用此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

我得到了这个结果

enter image description here

如何计算每种房型的可用房间数量,以便我可以使用[结果]中的下拉列表来允许用户选择他们想要的数量? (与Agoda.com网站类似。)

2 个答案:

答案 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月。