2012-01-08 9 views
3

予約システムの場合、私は客室、到着と出発があるテーブルがあります。無料の部屋を探す(予約システム)

例データ:

id | room | arrival | departure 
---+------+------------+----------- 
1 | 1 | 2011-03-12 | 2011-03-14 
2 | 1 | 2011-03-08 | 2011-03-09 
3 | 1 | 2011-03-19 | 2011-03-20 
4 | 2 | 2011-03-22 | 2011-03-30 
5 | 2 | 2011-03-19 | 2011-03-22 

私の質問は以下のようになります。私は新しい予約(2011-03-122011-03-10)を持っている場合、どのように私は自由である部屋をチェックできますか?

出力例は、12です。ここで

+2

3,4,5号室も利用可能です。 ( - >あなたは基本的に既存の部屋のリストを持つ追加のテーブルが必要です) – wildplasser

+0

OKです。私はまだこのテーブルを持っています – user1137370

答えて

3

日スパンのために、無料ではない部屋が表示されますクエリです:

select room from bookings where 
(arrival<'2011-03-12' and departure>='2011-03-12') -- overlap at the end 
OR (arrival<='2011-03-10' and departure>'2011-03-10') -- overlap at the start 
OR (arrival>='2011-03-10' and departure<='2011-03-12') -- complete overlap 

あなたはあなたが無料で部屋に

+0

PERFECT ... very nice :)私はちょうどDISTINCTを最初のステートメントに追加しました – user1137370

+0

これを展開すると、countds(*)をnumとして選択することができます。部屋ごとにグループ化します。これにより、NUMBERの衝突が表示されます。 - ホテルがいっぱいの場合、衝突回数が少ないと、ルームスワップで逃げる可能性。 (ちょうどあなたのDISTINCTにブレインストーミングする) –

+0

私は非常に似た問題を抱えていて、とてもあなたの解決策を出しました。私はあなたの答えを見たときに他のアイデアを探していました。まさに私がやっていたこと。クール:D –

1

を見つけること

select roomnumber from rooms where roomnumber not in (... as above ...) 

でこれを使用することができますこの目的のために比較演算子BETWEENを使用することもできます。この場合、次のようなことを行います:

SELECT r.id FROM room r WHERE r.id NOT IN 
(
    SELECT rb.room FROM room_booking rb WHERE 
     ('2011-03-10' BETWEEN rb.arrival AND rb.departure) OR 
     ('2011-03-12' BETWEEN rb.arrival AND rb.departure) 
) 
+0

私はBETWEENを好む。この場合、読みやすくなります。 – netcoder

+2

このクエリは完全な重なりを検出します。2011-03-10〜2011-03-12の部屋が予約されている場合、2011-03-08から2011-03-14のクエリは無料です開始と終了のオーバーラップのみを変更しますが、完全なオーバーラップは変更しません。 –

+0

それは本当ですが、私はこれを代わりにします: '( '2011-03-10' + INTERVAL 1 DAY)到着出発間と( '2011-03-12' - 区間1日間)到着出発間 – netcoder

関連する問題