2011-01-03 2 views
0

예약 시스템이 있습니다. 각 예약 엔트리가 들어 있습니다 [도착 일 : Jan 14, 2011 00:30; 출발 날짜 : 2011 년 1 월 16 일 00:30]; 이 예약 기간 내에 나타나는 모든 예약을 데이터베이스에 표시하고 싶습니다.은 기간 내 일치 항목

물론 이런 예약이 있습니다. [아래 참조] 처음 두 개는 이미 데이터베이스에 있습니다. 이제 세 번째 항목은 새로운 항목입니다. 세 번째 예약이 나타나는 시점에 1st와 2nd 둘 다 있습니다.

a: 2010 01 03 
d: 2010 01 10 

a: 2009 09 10 
d: 2010 02 10 

a: 2010 01 02 
d: 2010 01 05 

어떻게 MySQL에 쿼리합니까?

+0

먼저 DB 아키텍처에 대해 약간 알아야합니다. 예약에 고유 한 ID가 할당되어 있습니까? 날짜는 어디에 저장되어 있습니까? 예약 당? 갈라져? –

+0

예약 테이블은 다음과 같이 간단하다고 가정합니다. id | arrival_date | departure_date. – Gajus

답변

0

사용하여 SQL : 날짜 도착과 출발 BETWEEN

0
SELECT * FROM hp_reservations WHERE ((`arrival_date` BETWEEN i:arrival_date AND i:departure_date) OR (`departure_date` BETWEEN i:arrival_date AND i:departure_date)) AND `id` != i:id; 
0

그래서 당신이 바로, 예약 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에 의지 두 가지 사건에 속하지만 두 가지 사건 모두에 묶여 있지 않은 사건을 제공합니다.

관련 문제