这看起来有点令人费解。但是如果你能在这篇文章中快速阅读答案: Combining two SQL queries PDO
以下是我正在使用的Sample sqlfiddle: http://sqlfiddle.com/#!2/c4983/3
那么这里应该发生的是在我的SQL查询中:
SELECT r.RoomID AS RoomID,
RoomName,
NumOfRooms,
MaxPeopleExistingBeds,
MaxExtraBeds,
MaxExtraPeople,
CostPerExtraPerson,
MaximumFreeChildren,
IncludeBreakfast,
MinRate
FROM Rooms r
JOIN RoomDetails rd
ON r.RoomID = rd.RoomID
JOIN (
SELECT b.RoomID,
AccommodationID,
count(b.RoomID) AS Bookings
FROM Booking b
WHERE ArriveDate >= :aDate
AND DepartDate <= :dDate
GROUP BY RoomID
) t
ON t.AccommodationID = r.AccommodationID
WHERE r.AccommodationID = :aid
AND t.Bookings < NumOfRooms
GROUP BY RoomName
目前它检查每个房间的预订量是否达不到。然后显示它们。 但是,如果容量为1,则没有预订。它不会显示房间。
是否有可能以解决此问题的方式重建此语句?
答案 0 :(得分:2)
您加入AccommodationID
的第一件事就是忽略了Booking
表的房间ID,这会给您错误的房间预订计数,您还需要加入房间ID以及您需要使用LEFT
加入,所以如果预订没有任何回报,那么这意味着您的房间可用,当使用ON( t.AccommodationID =r.AccommodationID AND r.RoomID = t.RoomID)
加入时,您的预订栏将为空(即没有预订到这个房间)所以您需要额外的where条件来检查预订是否为null然后返回此房间也因为它可以有客人
SELECT r.RoomID AS RoomID,
RoomName,
NumOfRooms,
t.Bookings,
MaxPeopleExistingBeds,
MaxExtraBeds,
MaxExtraPeople,
CostPerExtraPerson,
MaximumFreeChildren,
IncludeBreakfast,
MinRate
FROM Rooms r
LEFT JOIN RoomDetails rd
ON r.RoomID = rd.RoomID
LEFT JOIN (
SELECT b.RoomID,
AccommodationID,
COALESCE(count(b.RoomID),0) AS Bookings
FROM Booking b
WHERE ArriveDate >= '2014-02-26'
AND DepartDate <= '2014-03-10'
GROUP BY RoomID
) t
ON( t.AccommodationID = r.AccommodationID
AND r.RoomID = t.RoomID)
WHERE r.AccommodationID = 1
AND (t.Bookings < NumOfRooms OR t.Bookings IS NULL)
GROUP BY RoomName;