2013-05-14 2 views
1

테이블에서 availables 룸을 가져 오기 위해 sql을 작성하는 데 문제가 있습니다.방 예약 쿼리

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

Table Booking 
ID | START_DATE | END_DATE 


Table BookingRoom (Intermediate Table) 
ID | BOOKING_ID |ROOM_ID 

방은 많은 예약에 링크 될 수 있으며, 예약은 내가이 봤어 많은 객실

Table Room 
Contains the ID room 

를 포함 할 수 있지만 룸은 별도의 날짜에서 2 명 differents의 예약에 연결되어있는 경우 probleme가 comparaison은 첫 번째 예약 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을 작성하는 데 도움이 수를 체크인 및 체크 아웃 날짜.

+0

특정 날짜/시간 또는 기간 동안 객실을 찾고 계십니까? –

+0

사실 나는 날짜와 체크 아웃 날짜 사이에 availables 룸을 찾고 있는데 – Safwen

답변

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 
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 
) 
+0

그는 특정 날짜가 아닌 날짜 범위를 찾고 있습니다 ... –