我很困擾以下問題。我有一系列的表格: 結合兩個SQL查詢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
我再結合兩者,並使用THI兩個陣列反饋在一個陣列中S功能:
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,那麼我知道我沒有這周的容量任何更多的預訂。但是,如果我有一個預訂和一個容量,那麼它仍然是滿的。但是,如果我的NumOfRoom爲2,並且預訂達到1,我知道我有空間。
所以基本上如果NumOfRooms> BookingCount那麼空間可用。
我怎麼能合併查詢和簡化我的代碼,以使這一切成爲可能?
IE把它簡單地說,我如何從BookingDetails中選擇所有的信息,並給出一個DepartDate和RoomID,其中NumOfRooms> count(Booking.RoomID)(它在這些日期和房間號等於房間的房間號)。
offtopic:請問什麼是用來生成該SQL映像的? – phoops
有點遺憾?這些表格是在Visio中創建的,SQL是輸入的,Array是從chrome的控制檯輸入的。使用Puush剪切出我想要的部分屏幕(ctrl + shift + 4)。這是所有的圖像佔,因爲我不知道你指的是:) –