当前位置: 首页 > 知识库问答 >
问题:

MySQL - 查找在特定日期有空房的酒店

涂飞航
2023-03-14

我看过很多类似的问题,但还没能让它为我所用。我正在创建一个酒店预订系统,我希望列出在请求的预订日期至少有一个房间可用的酒店。

这是我到目前为止提出的问题

SELECT
  ac.id,
  ac.name,
  ac.link,
  ac.type,
  ac.country,
  co.name AS countryName,
  ac.state,
  st.statename,
  ac.cityid AS cityId,
  ci.name AS cityName,
  ac.addr,
  ac.featuredimage,
  ac.amenities,
  ac.starrating,
  ac.bookings_received,
  ro.roomprice,
  SUM(ro.numberofrooms) AS totalRooms,
  roomsBooked = (
  SELECT
    *,
    SUM(numberofroomsbooked) AS roomsBooked
  FROM
    bookings
  WHERE
    reservationto >= '2016-07-07' AND reservationfrom <= '2016-07-09'
    AND hotelid = ro.hotel
)
FROM
  accomodations ac
JOIN countries co ON ac.country = co.id
JOIN states st ON ac.state = st.id
JOIN city ci ON ci.id = ac.cityid
JOIN room ro ON ac.id = ro.hotel
WHERE
  ac.active = 1 AND ac.delete = 0
GROUP BY
  ac.id

我是MySQL的新手,这真的失控了。这个想法是计算酒店的房间总数,减去给定日期范围内预订的房间总数。我能得到一些帮助吗?

子查询

      SELECT
        *,
        SUM(numberofroomsbooked) AS roomsBooked
      FROM
        bookings
      WHERE
        reservationto >= '2016-07-07' AND reservationfrom <= '2016-07-09'
        AND hotelid = ro.hotel

它自己就能很好地工作,但这个不行。

共有2个答案

屈昊天
2023-03-14

是否尝试过此查询?您按住宿酒店分组,因此,如果您将 SUM 函数与预订的房间一起使用,它应该会返回您预订的房间总数。我没有尝试过。

我希望它能解决你的问题。

SELECT
  ac.id,
  ac.name,
  ac.link,
  ac.type,
  ac.country,
  co.name AS countryName,
  ac.state,
  st.statename,
  ac.cityid AS cityId,
  ci.name AS cityName,
  ac.addr,
  ac.featuredimage,
  ac.amenities,
  ac.starrating,
  ac.bookings_received,
  ro.roomprice,
  SUM(ro.numberofrooms) AS totalRooms,
  SUM(numberofroomsbooked) AS bookedRooms
FROM
  accomodations ac
JOIN bookings b ON ac.id = b.hotelid
JOIN countries co ON ac.country = co.id
JOIN states st ON ac.state = st.id
JOIN city ci ON ci.id = ac.cityid
JOIN room ro ON ac.id = ro.hotel
WHERE
  ac.active = 1 AND ac.delete = 0
  AND reservationto >= '2016-07-07' AND reservationfrom <= '2016-07-09'
GROUP BY
  ac.id;
胡云瀚
2023-03-14

编辑:基于上一个查询构建

SELECT
  ac.id,
  ac.name,
  ac.link,
  ac.type,
  ac.country,
  co.name AS countryName,
  ac.state,
  st.statename,
  ac.cityid AS cityId,
  ci.name AS cityName,
  ac.addr,
  ac.featuredimage,
  ac.amenities,
  ac.starrating,
  ac.bookings_received,
  ro.roomprice,
  ro.totalRooms
FROM
  accomodations ac
JOIN countries co ON ac.country = co.id
JOIN states st ON ac.state = st.id
JOIN city ci ON ci.id = ac.cityid
JOIN (
  SELECT
    hotel,
    roomprice,
    SUM(numberofrooms) AS totalRooms
  FROM
    room
  GROUP BY
    hotel
) ro ON ac.id = ro.hotel
JOIN (
  SELECT
    hotelid,
    SUM(numberofroomsbooked) ASroomsBooked
  FROM
    bookings
  WHERE
    reservationto >= '2016-07-07' AND reservationfrom <= '2016-07-09'
  GROUP BY
    hotelid
) bo ON ac.id = bo.hotelid
WHERE
  ac.active = 1 AND ac.delete = 0
GROUP BY
  ac.id

更新了查询删除了内部选择并将其添加为内部连接

SELECT
  ac.id,
  ac.name,
  ac.link,
  ac.type,
  ac.country,
  co.name AS countryName,
  ac.state,
  st.statename,
  ac.cityid AS cityId,
  ci.name AS cityName,
  ac.addr,
  ac.featuredimage,
  ac.amenities,
  ac.starrating,
  ac.bookings_received,
  ro.roomprice,
  SUM(ro.numberofrooms) AS totalRooms,
  SUM(tm.roomsBooked ) as roomsBooked,
FROM
  accomodations ac
JOIN countries co ON ac.country = co.id
JOIN states st ON ac.state = st.id
JOIN city ci ON ci.id = ac.cityid
JOIN room ro ON ac.id = ro.hotel
(
  SELECT
    hotelid,
    SUM(numberofroomsbooked) AS roomsBooked
  FROM
    bookings
  WHERE
    reservationto >= '2016-07-07' AND reservationfrom <= '2016-07-09'
    group by hotelid
) tm on tm.hotelid=ro.hotel
WHERE
  ac.active = 1 AND ac.delete = 0
GROUP BY
  ac.id
 类似资料:
  • 问题内容: 我有如下所示的ind Mysql可用性表: 每个房间的每个可用日期都有一行。可能存在间隙,例如,房间1可能有8月1,2,3,5,6,13,14,15的条目,隔天不可用。 我需要查询以找到room_ids列表,其中在日期范围内每天都有可用的空间。 换句话说,获取room_id列表,其中在开始日期和结束日期之间的每个日期都有每个房间的条目。 问题答案: 您想要这样的东西: 该子句将计算该时

  • 问题内容: 使用MySQL 表 询问 我想以特定格式显示日期 预期产量 如何在mysql中进行查询。 需要查询帮助 问题答案: 您可以将DATE_FORMAT与格式字符串’%d-%M-%Y’一起使用。 结果:

  • 问题内容: 我绝不是MySQL专家,所以我正在寻求有关此问题的任何帮助。 我需要执行一个简单的测试(原则上),我有这个(简化的)表: 我需要在这里找到两件事: 如果任何用户的汽车任务中有日期重叠超过一天(任务结束可以与新任务开始的同一天)。 是否有两个用户试图在同一日期分配相同的汽车,或者他们在同一汽车上的日期范围重叠。 因此,我正在寻找的查询(或多个查询)应返回这些行: 我觉得我在这里碰壁,我很

  • 在一个日期列中有一个表,在同一个日期的不同时间有这么多总计的条目,但我不担心时间。我需要找到某些日期所有总额,随着用户名。当我使用下面的查询。它显示语法错误 选择用户名,总额,从账单日期='2013-04-12' 在上面的查询日期是列名,请帮我。

  • 问题内容: 是否可以查询特定日期? 我在mongo Cookbook中发现我们可以针对某个范围进行查询 ,例如: 但是可能有特定的日期吗?这不起作用: 问题答案: 如果您保存在数据库中的日期没有时间(恰好是年,月,日),那应该可行。 您保存的日期可能是,其中包括时间成分。要查询这些时间,您需要创建一个包含一天中所有时刻的日期范围。

  • 问题内容: 我的项目中有一种情况,如下所示。 在检查可用房间时 第一个查询从满足日期范围的预订表中检索房间号列表 类似地,第二个从餐桌预订上做同样的事情 最后一个查询使用上面两个查询提供的列表,并获取不在生成的列表中的房间列表。 可以在2010年10月8日/ 2010年8月15日正常工作 在20-08-2010 / 25-08-2010可以正常工作 当我给出10到15之间的日期时,它对于20到25