2017-11-03 2 views
1

이 같은 두 개의 테이블이MySQL은 왼쪽으로 가입 WHERE 조건

객실

id | number 
1 | 111 
2 | 112 

occupied_rooms

id | check_in | check_out | room_id 
1 | 2017-10-01 | 2017-10-04 | 1 

나는 모든 빈 객실 날짜에 따라 싶어 시도한이 중 check_in 및 check_out은

select r.id 
    , r.number 
    from rooms r 
    left join occupied_rooms o 
    on r.id = o.room_id 
where (o.check_in not between "2017-10-05" and "2017-10-08") 
or (o.check_in >= "2017-10-05" and o.check_out <= "2017-10-08")) 

그러나이 쿼리는 나에게 이와 같은 결과를 제공합니다. 잘못된 것입니다.

id | number 
1 | 111 

이 쿼리에는 어떤 문제가 있습니까? 도움과 의견을 보내 주셔서 감사합니다

+0

check_in, check_out의 기본값은 무엇입니까? 그게 널이야? –

답변

1

id이 일치하고 의도 한 체류 범위가 occupied_rooms 테이블의 범위와 겹치는 경우 두 테이블을 조인하기 만하면됩니다.

SELECT r.* 
FROM rooms r 
LEFT JOIN occupied_rooms t 
    ON r.id = t.id AND 
     ('2017-10-02' <= t.check_out AND '2017-10-03' >= t.check_in) 
WHERE 
    t.id IS NULL; -- NULL value indicates the room did not overlap 
        -- with any existing reservations 

또한 SQL 쿼리의 범위를 중복 처리하는 방법이 great reference question을 확인할 수 있습니다. 그것은 당신이 직면하고있는 문제를 훨씬 간단하게 만듭니다. 테이블에

Demo

+0

덕분에 "null입니다"를 추가하고 쿼리가 PHP 스크립트에서 해고 될 때 예상대로 작동하지만 쿼리가 phpmyadmin에서 실행될 때 결과가 두 개만 나오면 하나의 결과 만 제공됩니다 -> select rooms.number \t ' room'''''''''''''''''' occupied_rooms''''_room_id'''에'occupied_rooms'''에 합류했습니다. \t ('occupied_rooms'.check_in'은 "2017-10-02"와 "2017-10-02"사이에 있지 않습니다. "또는 ('occupied_rooms'.check_in'> ="2017-10-02 "and'occupied_rooms'.check_out' <="2017-10-08 ")) 또는'occupied_rooms'.id는 null입니다 – sanu

+0

편집 내 데모, 그것을 업데이 트하고 여기에 링크를 붙여 넣습니다. 귀하의 데이터가 문제라고 추측합니다. –

0

귀하의 데이터는 occupied_rooms는 "여기서"의 첫 번째 조건을 충족;

check_in 일 (2017년 10월 1일)는 "2017년 10월 5일"와 "2017년 10월 8일"와이 또는 당신의 사이가 아닙니다.

따라서 결과는이 데이터에 포함됩니다.

출력 예상치를 알려주시겠습니까?

+0

겹치는 범위는 q.v.보다 약간 복잡합니다. 여기 : https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap –