在SQL语句中,如果没有找到特定查询的任何内容,则返回一个条目

时间:2014-04-05 20:14:33

标签: php mysql sql pdo

这看起来有点令人费解。但是如果你能在这篇文章中快速阅读答案: 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,则没有预订。它不会显示房间。

是否有可能以解决此问题的方式重建此语句?

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;

Fiddle Demo