그래서 당신이 바로, 예약 A와 예약 B 사이에 모든 예약을하려면 예약 FROM
SELECT *?
엔드 포인트를 표시하는 두 가지 예약을 이미 알고 있다고 가정하는 것이 안전합니까? 그렇다면 꽤 간단하지만 (I had to ask awhile back), 분명하지 않을 수 있습니다.
시나리오 1 - 알려진 날짜 :
$booking_a_arr = 2010-01-03;
$booking_a_dep = 2010-01-10;
$booking_b_arr = 2009-09-10;
$booking_b_dep = 2010-02-10;
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= '$booking_a_arr' AND
departure <= $booking_b_dep";
시나리오 2 - 알려진 아이디 :
$booking_a_id = "A";
$booking_b_id = "B";
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_a_id')
AND departure <= (SELECT departure FROM BOOKINGS WHERE id = '$booking_b_id')";
: 만 예약 ID로
,이 날짜를 얻기 위해 각 예약에 대한 하위 쿼리를 필요
도착 날짜를 이전 예약 날짜보다 크게 설정하고 출발 날짜를 이후 예약 날짜보다 작게 설정하면 기본적으로 결과가 중간에 있지만 st 아픈 외부 예약이 포함되어 있습니다. 당신이 그 두 사건 사이에 중복되지만,하지 않는 모든 예약의 목록을 원한다면, 당신은 너무 좋아, 대신 자신의 바깥 쪽 가장자리의 두 이벤트의 내부 가장자리에 경계를 설정합니다 : 그에서
$booking_a_id = "A";
$booking_b_id = "B";
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT departure FROM BOOKINGS WHERE id = '$booking_a_id')
AND departure <= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_b_id')";
마지막 경우 두 원본 예약 자체가 겹치면 오버랩 내부에서 예약 된 모든 이벤트를 반환합니다. 이 경우, 당신은 단지 시작과 겹치는 안에 끝나지 않을, 그 중복에 빠지고 싶은 경우에, 당신은 사용한다 :
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT departure FROM BOOKINGS WHERE id = '$booking_a_id')
OR departure <= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_b_id')";
를 위의 모든 경우에, AND
에서 쿼리를 전환 OR
에 의지 두 가지 사건에 속하지만 두 가지 사건 모두에 묶여 있지 않은 사건을 제공합니다.
먼저 DB 아키텍처에 대해 약간 알아야합니다. 예약에 고유 한 ID가 할당되어 있습니까? 날짜는 어디에 저장되어 있습니까? 예약 당? 갈라져? –
예약 테이블은 다음과 같이 간단하다고 가정합니다. id | arrival_date | departure_date. – Gajus