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