2016-07-04 5 views
0

私は多くの同様の質問を読んだが、それは自分のために働くことができませんでした。私はホテルの予約システムを作成しており、予約された予約日に少なくとも1つの部屋があるホテルをリストしたいと思います。ここで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への新たなんだだと、これは本当に手に負えなくなってきています。アイデアは、ホテルの総客室数を計算し、指定された期間内に予約された客室の総数を差し引くことです。私はそれについていくつかの助けを得ることができますか?

サブクエリ完全にそれ自身ではなく、この1で

 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 with @ 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インナーを取り出し、インナーとして、それを追加すると内蔵は、このクエリを

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

あなたのお手伝いをしてくださってありがとうございました。私はデータを正しく扱っている最終的なクエリを含めるようにあなたの答えを編集しました。編集を承認してください。私は正しい答えとしてあなたの名前を記入します。 – VeeK

+0

うわー。承認済み –

+0

これを回答としてマークしてください。そうでない場合、未回答の質問として表示されます。 –

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; 
関連する問題