2016-07-04 28 views
0

我已閱讀了許多類似的問題,但無法使其適用於我自己。我正在創建一個酒店預訂系統,我希望列出在請求的預訂日期內至少有一個房間可用的酒店。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 

的作品,但不是在這一個。

+0

添加一些示例數據,您的預期結果更有幫助。 – Blank

+0

idem與@ 10086 –

+0

我無法將我的數據添加到sqlfiddle,您有其他建議嗎? – VeeK

回答

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 
+0

感謝Mahesh的幫助,你幾乎是正確的。我編輯了您的答案,以包含正確處理我的數據的最終查詢。請接受編輯,我會將你的標記標記爲正確答案 – VeeK

+0

太好了。批准 –

+0

請標記爲答案否則t將顯示爲未答覆的問題 –

0

你嘗試此查詢?您正在按住宿酒店分組,因此,如果您將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;