Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将两个SQL查询组合到PDO_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 将两个SQL查询组合到PDO

Php 将两个SQL查询组合到PDO,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我在以下问题上陷入了困境。我有一系列的表格: 我想做的是获取一个房间的所有信息,假设预订量不超过该房间的可用房间数 因此,要获取我的房间详细信息,我的SQL是: 选择Rooms.RoomID作为RoomID, 房间名称,房间数量, MaxPeople现有床位, MaxExtraBeds, 麦克斯韦人, CostPerExtraPerson, 最大限度地保护儿童, 包括说得快, 切碎 从房间,房间细节 WHERE Rooms.accountationId=:辅助和 Rooms.RoomID=Ro

我在以下问题上陷入了困境。我有一系列的表格:

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

因此,要获取我的房间详细信息,我的SQL是:

选择Rooms.RoomID作为RoomID, 房间名称,房间数量, MaxPeople现有床位, MaxExtraBeds, 麦克斯韦人, CostPerExtraPerson, 最大限度地保护儿童, 包括说得快, 切碎 从房间,房间细节 WHERE Rooms.accountationId=:辅助和 Rooms.RoomID=RoomDetails.RoomID 按房间名分组 返回后,我会得到这些房间的详细信息列表,如下所示:

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

选择Booking.RoomID, countBooking.RoomID作为预订 从预订 其中ArriveDate>=:aDate和 出发日期订房计数,则房间可用

如何合并这两个查询并简化代码以实现这一点


简单地说,我如何从RoomDetails中选择所有信息?给定预订中的到达日期、出发日期和RoomID,其中NumOfRooms>countBooking.RoomID在这些日期内,并且RoomID等于房间的RoomID。

您的问题可以通过简单地更新SQL语句本身来解决:

选择r.RoomID作为RoomID, 室名, 新房, MaxPeople现有床位, MaxExtraBeds, 麦克斯韦人, CostPerExtraPerson, 最大限度地保护儿童, 包括说得快, 切碎 从r房间 加入RoomDetails路 在r.RoomID=rd.RoomID上 参加 选择b.RoomID, 住宿ID, 将b.室友计算为预订 预订b 其中ArriveDate>=:aDate
和DepartDate您可以选择所需日期范围内每个房间的所有预订计数作为子查询,然后根据所需住宿ID和所需NumOfRooms>BookingCount条件过滤的房间列表左键加入该子查询。这里的关键是用于此子查询的联接类型,因为内部联接会将结果限制为仅包含实际预订的房间

    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

offtopic:我可以问一下是什么用来生成SQL映像的吗?哪一点对不起?这些表是在Visio中创建的,SQL是键入的,数组来自chrome的控制台。使用Puush剪切屏幕上我想要ctrl+shift+4的部分。这就是所有的图片,因为我不确定你指的是哪个:谢谢你的回答。sql在没有第三个联接的情况下工作,但是第三个联接中的查询在没有其他所有sql的情况下工作,但是它们不能一起工作。我认为逻辑上的某个地方有缺陷。第三个内部联接返回例如4个RoomID及其预订。如果在此期间没有该室友的预订,则不会有该室友的登记。我发现,如果我更改和t.Bookings,它将显示所有,但不显示任何,因此,如果房间数不大于预订数,则它们不会显示。问题是在此期间,即使没有预订,也没有显示。@DavidG您可以提供SQLFIDLE的示例数据吗?@DavidG SQLFIDLE中的所有房间的容量都为1。如果是这种情况,那么您将不会收到t.Bookings 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