代码之家  ›  专栏  ›  技术社区  ›  user3924829

如何检查特定日期时间是否未使用多个表?

  •  1
  • user3924829  · 技术社区  · 10 年前

    共有3张表: 建筑 , 房间 , 保留 .

    1栋楼=n个房间
    1个房间=n个预订

    桌上建筑物- 身份证件 (int), 名称 (varchar)
    餐桌室- 身份证件 (int), 建筑_标识 (整数)
    餐桌预订- 身份证件 (int), 房间id (int), 日期_开始 (日期时间), 日期_结束 (日期时间)

    建筑物表示例

    <pre>
    ID    name
    1     Building A
    2     Building B
    3     Building C
    </pre>
    

    房间表示例

    <pre>
    ID    building_id
    1     1
    2     1
    3     2
    4     3
    </pre>
    

    预订表示例

    <pre>
    ID    room_id     date_start            date_end  
    1     1           2014-08-09 14:00:00   2014-08-09 14:30:00
    2     1           2014-08-09 14:30:00   2014-08-09 15:30:00
    3     3           2014-08-09 16:30:00   2014-08-09 17:30:00
    4     2           2014-08-09 16:00:00   2014-08-09 17:00:00
    5     3           2014-08-09 16:00:00   2014-08-09 16:30:00
    </pre>
    

    问题

    如何过滤在特定日期和时间至少有1个房间可用的所有建筑?

    例如,我们希望过滤在2014-08-09 16:00:00至2014-08-09 17:00:00期间至少有1个可用房间的所有建筑。在这种情况下,它将显示 A栋 以及 C栋 可用。 A栋 有1个空余房间 B栋 还有一个免费房间,因为那个房间没有预订。

    有人能帮我解决这个问题吗?我只是无法通过一个MySQL查询来获取所有建筑。非常感谢。

    2 回复  |  直到 10 年前
        1
  •  0
  •   Gordon Linoff    10 年前

    使用 LEFT JOIN 连接 rooms 表到 reservations 表中的时间条件 on 条款然后,看看哪里没有火柴——这些是可用的房间。

    SELECT b.id, b.name, COUNT(*) as NumRoomsAvailable
    FROM buildings b JOIN
         rooms r
         ON b.id = r.building_id LEFT JOIN
         reservations rv
         ON rv.room_id = r.id AND
            '2014-08-09 16:00:00' BETWEEN rv.date_start AND rv.date_end
    WHERE rv.room_id is null
    GROUP BY b.id;
    

    最后一步是按建筑汇总,而不是单独列出每个可用房间。

        2
  •  0
  •   PravinS    10 年前

    尝试此查询

    SELECT b.name,r.id,rv.date_start,rv.date_end FROM buildings b
    LEFT JOIN rooms r ON b.id = r.building_id 
    LEFT JOIN reservataions rv ON rv.room_id = r.id
    WHERE  '2014-08-09 16:00:00' BETWEEN rv.date_start AND rv.date_end