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

标签 mysql

我读过很多类似的问题,但无法使其对自己有用。我正在创建一个酒店预订系统,我希望列出在请求的预订日期至少有一间客房可用的酒店。

这是我的表结构 Table Structure

这是我到目前为止的查询

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

它本身可以完美工作,但在这个中则不然。

最佳答案

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

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

关于MySQL - 查找特定日期有空房的酒店,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178642/

相关文章:

mysql - 为 MySql 中的 View 生成唯一长 ID

php - PHP和mysql中按时间自动更改变量

php - Mysql查询疑问

php - 如何更改表以删除存在的列?

mysql - SQL/mysql - 如何显示 1 个表中具有不同值的两列

mysql - 在mysql中找到没有原始记录的重复记录

mysql - 使用 VARCHAR 作为 ID 的任何数据库问题

php - 接收订单详情和付款确认(电子商务网站)

php - 如何检查mysql中是否使用了限制?

php - Wordpress 开发 VS 生产环境