[英]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.