0

テーブルから利用可能な部屋を取得するための SQL の記述に問題があります。

私のテーブル構造を以下に示します。

Table Booking
ID | START_DATE | END_DATE


Table BookingRoom (Intermediate Table)
ID   | BOOKING_ID   |ROOM_ID

部屋は多くの予約にリンクでき、予約には多くの部屋を含めることができます

Table Room
Contains the ID room

私はこれを試しましたが、部屋が別々の日付の2つの異なる予約にリンクされている場合、最初の予約IDのみで比較が行われるという問題があります

SELECT DISTINCT r.ID FROM room AS r ,booking AS b,bookingroom AS br
 WHERE r.ID = br.ID_ROOM
 AND b.ID = br.ID_BOOKING
 AND (
           b.END_DATE < '05/14/2013'
        OR b.START_DATE > '05/15/2013'
     )

チェックイン日とチェックアウト日の間に利用可能な部屋を取得するための SQL を書くのを誰か手伝ってくれませんか?

4

2 に答える 2

2

希望する日付の範囲全体で利用可能な部屋のリストだけが必要な場合は、次のようなものが機能する可能性があります。

Select Room.Id
From Room
Where Room.Id Not In    (
                        Select RoomId
                        From BookingRoom
                            Join Booking
                                On Booking.Id = BookingRoom.BookingId
                        Where Booking.StartDate <= 'DesiredEndDate'
                            And Booking.EndDate >= 'DesiredStartDate'
                        )
Order By Room.Id

したがって、元の例を使用すると、次のようになります。

Select Room.Id
From Room
Where Room.Id Not In    (
                        Select RoomId
                        From BookingRoom
                            Join Booking
                                On Booking.Id = BookingRoom.BookingId
                        Where Booking.StartDate <= '2013-05-15'
                            And Booking.EndDate >= '2013-05-14'
                        )
Order By Room.Id
于 2013-05-15T01:16:36.833 に答える
0

「X 日に行われたすべての予約」の明確なレコードセットを定義し、外部結合を使用して、その日の予約がない部屋を取得する必要があります。

SET @myDate = #someDay#
SELECT R.ID
FROM Room R
WHERE R.ID NOT IN (
    SELECT BR.ROOM_ID
    FROM BookingRoom BR
    INNER JOIN Booking B ON BR.Booking_ID = B.ID
    WHERE @myDate BETWEEN B.start_date and B.end_date
)

編集:

予約中にすべての空き部屋が必要なため、より複雑なクエリを実行する必要があります。日付ベースの多対多クエリを実行することは PITA であるため、問題の日付が既に外部にロードされていると仮定します。

SET @dateStart = #Start#
SET @dateEnd = #End#

SELECT R.ID
FROM Room R
WHERE R.ID NOT IN (
    SELECT BR.ROOM_ID
    FROM BookingRoom BR
    INNER JOIN Booking B ON BR.Booking_ID = B.ID
    WHERE B.start_date BETWEEN @dateStart AND @dateEnd
    AND B.end_date BETWEEN @dateStart AND @dateEnd
)
于 2013-05-15T00:05:25.390 に答える