【问题标题】:MySQL - Find hotels that are available on certain datesMySQL - 查找特定日期可用的酒店
【发布时间】:2016-07-04 19:56:52
【问题描述】:

我已经阅读了许多类似的问题,但我无法使其适合自己。我正在创建一个酒店预订系统,我希望列出在请求的预订日期至少有一间客房可供预订的酒店。

这是我的表结构

这是我目前的查询

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

它自己完美地工作,但不是在这个。

【问题讨论】:

  • 添加一些示例数据,您的预期结果会更有帮助。
  • 我无法将我的数据添加到 sqlfiddle,您还有其他建议吗?

标签: mysql


【解决方案1】:

编辑:基于上一个查询

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

【讨论】:

  • 感谢 Mahesh 的帮助,您几乎是正确的。我已经编辑了您的答案,以包含正确处理我的数据的最终查询。请接受修改,我会将您的修改标记为正确答案
  • 请将此标记为答案,否则将显示为未回答的问题
【解决方案2】:

你试过这个查询吗?您是按住宿酒店分组的,因此,如果您对预订房间使用函数 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;

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多