3

それで、私はホテルで機能するWebアプリケーションを設計しており、最終的には、いくつかの追加コードを使用して、すべてのホテルWebサイトに簡単にインストールできるようになるはずです。アプリケーションはphpとmysqlで動作しています。ですから、おそらくご想像のとおり、私はデータベース構造とかなり混乱しています。しかし、私はいくつかの調査を行い、予約のための本格的なシステムを求めているだけではありません。

そのため、ホテルの所有者は多くのタイプの部屋を持っている必要があります。ですから、おそらく部屋のテーブルは「必須」だと思います。どうぞ:

---------- Rooms Table (example)

ID     NAME         ADULTS     ROOM_COUNT     PRICE/NIGHT     

1      DoubleRoom   2          5              45$
2      Family       3          2              75$
3      Single       1          3              35$

これは非常に簡単です。私のアプリケーションを介して部屋を追加することができます。また、各部屋の適切な説明とさまざまな画像を添付します。しかし、要点に戻りましょう。人々はそう予約する必要があります...

---------- Bookings Table (example)

ID    ROOM_ID      BOOKING_USER     CHECKIN (timestamp)   CHECKOUT (timestamp)

1     2            A full name      208420842042          308230482042824
2     3            A full name      208423242525          529752972595272
...

つまり、これは-うまくいけば-データベース構造です。今、私は可用性をチェックする方法を考えています。ばかげているように聞こえるかもしれませんが、賢くて簡単な方法がわかりません。ウェブサイトの形式では、次のフィールドがあるはずです:check-in dateそして、check-out-dateそれはタイムスタンプに変換されますそして..さて、これが私が立ち往生した時間です!

上記のテーブルしかない場合、どうすれば空室状況を確認できますか。データベース構造を変更する方法はありますか、または変更する必要がありますか?空室状況を確認しても、部屋の総数ROOM_COUNTはどうしてカウントされるのですか?つまり、複数のタイプの部屋の空室状況を確認するにはどうすればよいですか?私は次のようなことを考えました:

SELECT count(ROOM_ID) FROM bookings WHERE
bookings.checkin < DATE_GIVEN_AS_CHECKIN_INPUT and
bookings.checkout > DATE_GIVEN_AS_CHECKOUT_INPUT

次に、このクエリの出力に応じて、利用可能な部屋があるかどうかがわかります。しかし、部屋数はどうですか?より良い方法はありますか?

ここの誰かがこれについて私に教えてくれたら本当にうれしいです。これを読んでもよろしくお願いします!
ブレーン

PSああ、それは宿題ではありません!:PIはとにかく学校に行かない:D

4

2 に答える 2

5

次のクエリは、予約のないすべての部屋、またはチェックイン/チェックアウト入力の前後の予約を検索します。

SELECT r.*
FROM rooms r
LEFT JOIN bookins b ON b.room_id = r.id
WHERE b.id IS NULL
OR (b.checkout >= DATE_GIVEN_AS_CHECKIN_INPUT AND b.checkin >= DATE_GIVEN_AS_CHECKOUT_INPUT)
OR (b.checkout <= DATE_GIVEN_AS_CHECKIN_INPUT AND b.checkout <= DATE_GIVEN_AS_CHECKOUT_INPUT)

部屋数を取得するには、次のように置き換えSELECT r.*ますSELECT COUNT(DISTINCT r.id)

于 2012-08-20T18:46:46.050 に答える
2

タイムラインでリクエストされた期間 [SDATE,EDATE] を見ると、リクエストされた期間を (完全に/部分的に) 占有できる 4 つの予約ケース (1)、(2)、(3)、(4) があります。

    SDATE    EDATE
      |--------|              <-- requested period

  |--1--|   |--2--|           <-- booking periods
    |-----3------|            <-- relevant for
        |-4--|                <-- occupancy test

|-5-|            |--6--|      <-- periods not relevant 

これらのピリオド ケース (1、2、3、および 4) は、次のステートメントで見つけることができます。

ケース 1、2、および 3

WHERE (b.checkout >= SDATE AND b.checkin >= EDATE)

ケース 4:

WHERE (b.checkout <= SDATE AND b.checkin >= EDATE)

次に、これら 2 つのケースを組み合わせて、特定の期間 [SDATE,EDATE] に占有されている部屋のすべての部屋 ID を一覧表示するクエリは次のとおりです。

SELECT DISTINCT b.roomid FROM bookings AS b
WHERE (b.checout >= SDATE AND b.checkin <= EDATE)
OR (b.checkout <= SDATE AND b.checkin >= EDATE)

逆のケースが必要なため、リクエストされた期間に利用可能なすべての部屋があるため、クエリは次のようになります。

SELECT r.roomid FROM rooms AS r WHERE r.roomid NOT IN
(
  SELECT b.roomid FROM bookings AS b
  WHERE (b.checout >= SDATE AND b.checkin <= EDATE)
  OR (b.checkout <= SDATE AND b.checkin >= EDATE)
)

サブクエリでは DISTINCT は必要ありません (1 が [1,2] にない場合、[1,1,2] にもありません)。

于 2013-02-08T12:09:31.217 に答える