복붙노트

[SQL] 룸 예약 쿼리

SQL

룸 예약 쿼리

나는 테이블에서 availables의 객실을 얻을 수있는 SQL을 작성하는 문제가있다.

내 테이블 구조는 다음과 같다.

Table Booking
ID | START_DATE | END_DATE


Table BookingRoom (Intermediate Table)
ID   | BOOKING_ID   |ROOM_ID

방은 많은 예약에 링크 될 수 있으며, 예약은 많은 객실을 포함 할 수 있습니다

Table Room
Contains the ID room

이 시도했지만 comparaison가 첫 번째 예약 ID로 표시했습니다 될 것입니다 룸은 별도의 날짜에서 2 명 differents의 예약에 연결되어있는 경우 probleme가있다

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을 쓸 수 있습니다.

해결법

  1. ==============================

    1.당신이 원하는 모든 원하는 날짜, 다음과 같은 힘 작업과 같은 무언가의 전체 범위에 해당하는 객실의 목록입니다 경우 :

    당신이 원하는 모든 원하는 날짜, 다음과 같은 힘 작업과 같은 무언가의 전체 범위에 해당하는 객실의 목록입니다 경우 :

    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
    
  2. ==============================

    2.당신은 "일 X에 만든 모든 예약"에 대한 명확한 레코드를 정의하고 말했다 하루 동안 예약을하지 않는 객실을 검색하기 위해 외부 조인을 사용하는 것이 좋습니다.

    당신은 "일 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
    )
    

    편집하다:

    당신이 예약시 열려있는 모든 객실을 원하기 때문에, 당신은 더 복잡한 쿼리를 수행해야합니다. 나는 당신이 이미 날짜 기반의 다 대다 쿼리 피타이다하고 있기 때문에, 질문로드 외부의 날짜를 가정합니다.

    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
    )
    
  3. from https://stackoverflow.com/questions/16554649/room-booking-query by cc-by-sa and MIT license