0

これを達成する方法を見つけるために14時間以上費やしましたが、運がありません!

私は予約システムに取り組んでいます.2つのテーブルがあります:

Rooms
---------
ID - ROOM_TYPE - NAME - ROOM_COUNT
1       1   single room      6
2       2   double room      4
3       3   studio           2


Booking
---------
ID - ROOM_TYPE - Customer_NAME  - CHECK_IN  - CHECK_OUT
1       3         John   A           1-1-2013      4-1-2013
2       3         John   B           2-1-2013      5-1-2013             
3       2         John   C           8-1-2013      9-1-2013              

ユーザーが利用可能な部屋を検索するために 2 つの日付を入力した後、私が持っているすべてのタイプの部屋を表示するクエリを作成します。3 つのタイプ (シングル/ダブル/スタジオ) があり、各タイプにはホテルで利用可能な部屋の数があります (例: : ホテルにはデフォルトで 6 つのシングルルームがあります)

利用可能なすべてのタイプの部屋を取得するために、このクエリで終了します

            SELECT * 
            FROM rooms              
             where id NOT IN 
                 ( SELECT room_type FROM  booking 
                    WHERE "'.$check_in.'"  <= check_out
                    AND "'.$check_out.'"  >= check_in                                             
                  )  

ROOMSテーブルのROOM_COUNTフィールドに保存された値よりも少ない予約からのWHEREカウント(room_type)という別の条件を作成する必要があります..

上記の表の構造によって異なりますが、ホテルにはスタジオが 2 つしかなく、2013 年 4 月 1 日にはすべて利用できません..そのため、誰かがその日付で検索した場合、クエリはスタジオ タイプの部屋を表示すべきではありません..

部屋の種類ごとに予約数を数えて結果を表示するようなものが必要です..

前もって感謝します

4

1 に答える 1

0

これがアイデアです。期間中に取得された部屋の最大数を知る必要があります。その日の前のチェックイン数からチェックアウト数を引いて、特定の日に使用された部屋数を取得できます。

次に、最大値を取得するには、チェックイン日のみを確認する必要があります (チェックアウトにより最大値が減少するため)。以下は、チェックインのある日に最大値を取得します。

select r.room_type, r.room_count, r.room_count - RoomsTaken
from Rooms r join
     (select room_type, max(Num_CheckOuts - num_CheckIns) as RoomsTaken
      from (select b.*,
                   (select count(*) from booking b2 where b2.room_type = b.room_type and b2.check_in <= b.check_out
                   ) as num_CheckIns,
                   (select count(*) from booking b2 where b2.room_type = b.room_type and b2.check_out <= b.check_in
                   ) as Num_CheckOuts
            from booking b
           ) b
      where $check_in <= check_out and $check_out >= check_in
      group by room_type
     ) b
     on r.room_type = b.room_type

(注: このクエリはテストされていないため、構文エラーがある可能性があります。)

相関サブクエリを使用して累積カウントを取得します。他のデータベースでは、この目的でウィンドウ関数が使用される場合があります。

于 2013-01-27T16:02:24.907 に答える