web-dev-qa-db-ja.com

空室状況のSQLクエリ

データベースに次のテーブルがあります。1 .Roomtypes 2 .Reservations

Roomtypesには次の列があります
id
product_id
type
total_no_of_rooms
created_at
updated_at

Reservationには次の列があります
id
roomtype_id
customer_id
check_in
check_out
no_of_rooms
created_at
updated_at

誰かが部屋を予約した場合、ルームタイプテーブルに残っている部屋を取得する必要があります。それは、特定の日付の部屋、予約されていない部屋の詳細です。誰もがクエリで私を助けることができます

1

テーブルCREATEスクリプトがない場合、私の推測は次のようになります。

SELECT rt.id, rt.type, rt.total_no_of_rooms, 
    IFNULL(SUM(r.no_of_rooms), 0) as "reserved rooms", 
    rt.total_no_of_rooms - IFNULL(SUM(r.no_of_rooms),0) as "rooms available"  
FROM Roomtypes rt 
    LEFT OUTER JOIN Reservation r ON r.roomtype_id = rt.id 
        AND CURRENT_TIMESTAMP BETWEEN r.check_in AND r.check_out
GROUP BY rt.id, rt.type, rt.total_no_of_rooms

このクエリは、各部屋タイプで利用可能な部屋の数を取得する必要があります(CURRENT_TIMESTAMP)ですが、他のタイムスタンプに置き換えることができます。 「2018-05-17 10:00:00」。

データ範囲内で利用可能な部屋の数を確認するには、2018-04-11 10:00:00にチェックインし、2018-04-12 09:59:59に最新のチェックアウトします。

SELECT rt.id, rt.type, rt.total_no_of_rooms, 
  IFNULL(SUM(r.no_of_rooms), 0) as "reserved rooms", 
  rt.total_no_of_rooms - IFNULL(SUM(r.no_of_rooms),0) as "rooms available"  
FROM Roomtypes rt 
  LEFT OUTER JOIN Reservation r ON r.roomtype_id = rt.id 
      AND '2018-04-11 10:00:00' >= r.check_in 
      AND '2018-04-12 09:59:59' <= r.check_out
GROUP BY rt.id, rt.type, rt.total_no_of_rooms

作成スクリプトを使用したsqlfiddleの例(MySQL 5.6)です

1
dbdemon