簡體   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