繁体   English   中英

结合两个SQL查询PDO

[英]Combining two SQL queries PDO

我对以下问题颇为困惑。 我有一系列表格: 桌子的图像为方便起见

我想做的是获取一个房间的所有信息,假设预订数量不超过该房间的可用房间号。

因此,要获取我的会议室详细信息,我的SQL是这样的:

  SELECT Rooms.RoomID as RoomID,
         RoomName, NumOfRooms, 
         MaxPeopleExistingBeds, 
         MaxExtraBeds, 
         MaxExtraPeople, 
         CostPerExtraPerson, 
         MaximumFreeChildren, 
         IncludeBreakfast, 
         MinRate 
    FROM Rooms, RoomDetails 
   WHERE Rooms.AccommodationID = :aid AND 
         Rooms.RoomID = RoomDetails.RoomID 
GROUP BY RoomName

返回后,我得到了这些房间的详细信息列表,如下所示: 在此处输入图片说明

然后,我使用此查询来获取预订数量和房间ID:

  SELECT Booking.RoomID, 
         count(Booking.RoomID) as Bookings  
    FROM Booking 
   WHERE ArriveDate >= :aDate AND 
         DepartDate <= :dDate AND 
         AccommodationID = :aid 
GROUP BY RoomID

然后,我将两者结合起来,并使用此函数将两个阵列反馈到一个阵列中:

public function get_availability($aid, $aDate, $dDate) {
        $stmt = $this->db->prepare('SELECT Rooms.RoomID as RoomID, RoomName, NumOfRooms, MaxPeopleExistingBeds, MaxExtraBeds, MaxExtraPeople, CostPerExtraPerson, MaximumFreeChildren, IncludeBreakfast, MinRate FROM Rooms, RoomDetails WHERE Rooms.AccommodationID = :aid AND Rooms.RoomID = RoomDetails.RoomID GROUP BY RoomName');
        $stmt->bindValue(':aid', $aid);
        $stmt->execute();
        $rooms = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $stmt2 = $this->db->prepare('SELECT Booking.RoomID, count(Booking.RoomID) as Bookings  FROM Booking WHERE ArriveDate >= :aDate AND DepartDate <= :dDate AND AccommodationID = :aid GROUP BY RoomID');
        $stmt2->bindValue(':aid', $aid);
        $stmt2->bindValue(':aDate', $aDate);
        $stmt2->bindValue(':dDate', $dDate);
        $stmt2->execute();
        $bookings = $stmt2->fetchAll(PDO::FETCH_ASSOC);
        $room = array($rooms, $bookings);

        return (!empty($room)) ? $room : false;
    }

问题是,我实际上只想返回NumOfRooms小于预订数的房间详细信息。

因此,例如,在我有$预订的情况下,如果它告诉我ID为4的房间,在设定的时间段内我有3个预订,而我的NumOfRooms为1。那么我知道那周我没有能力再进行任何预订。 。 但是,如果我有1个预订和一个名额,那么那还是满的。 但是,如果我的NumOfRooms为2,并且预订数为1,我知道我有房间。

因此,基本上,如果NumOfRooms> BookingCount,那么房间可用。

如何合并两个查询并简化代码以实现此目的?

IE简而言之,我如何从RoomDetails中选择所有信息,在预订中指定ArriveDate并指定DepartDate和RoomID,其中NumOfRooms> count(Booking.RoomID)(在这些日期之内且房间ID相等)到“房间”的房间ID)。

您的问题可以通过简单地更新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

您可以选择所需日期范围的每个房间的所有预订计数作为子查询,然后根据所需的AccommodationID和所需的NumOfRooms > BookingCount条件筛选出的客房列表中的LEFT JOIN该子查询。 此处的关键在于此子查询使用的联接类型,因为内部联接会将您的结果限制为仅实际预订的房间。

    SELECT Rooms.RoomID as RoomID,
           RoomName, NumOfRooms, 
           MaxPeopleExistingBeds, 
           MaxExtraBeds, 
           MaxExtraPeople, 
           CostPerExtraPerson, 
           MaximumFreeChildren, 
           IncludeBreakfast, 
           MinRate,
           BookingCount
      FROM Rooms
INNER JOIN RoomDetails on Rooms.RoomID = RoomDetails.RoomID
 LEFT JOIN (
               SELECT Booking.RoomID,
                      count(Booking.RoomID) as BookingCount
                 FROM Booking 
                WHERE ArriveDate >= :aDate AND 
                      DepartDate <= :dDate
             GROUP BY Booking.RoomID
           ) RoomBookings ON Rooms.RoomID = RoomBookings.RoomID
     WHERE Rooms.AccommodationID = :aid
       AND NumOfRooms > BookingCount
  GROUP BY RoomName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM