2010-04-28 7 views
6

겹치는 :MySQL을 찾는 시간이 나는 다음과 같은 속성을 데이터베이스에이 개 테이블이

Booking 
======= 
booking_id 
booking_start 
booking_end 

resource_booked 
=============== 
booking_id 
resource_id 

두 번째 표는 "예약"과 "자원"사이의 연관 기업 (즉, 경고가 많이 포함 할 수 있습니다 자원). 속성 booking_start 및 booking_end는 날짜 및 시간이 포함 된 타임 스탬프입니다.

비슷한 resource_id의 다른 예약과 날짜/시간이 겹치거나 충돌하는 경우 어떻게 각 resource_id (resource_booked)를 찾을 수 있는지 알 수 있습니까?

나는 그것이 제가이 문제를 해결 수있는 방법을 시각화하는 데 도움이 될 내가 가지고 있는지 확인하기 위해, 그림으로, 종이에 답을 낙서 한

이 :

  1. 는 하나 개의 테이블에 두 테이블 (예약, Booked_resource를) 가입 4 가지 속성이 필요합니다.
  2. 대답은 여기 제안에 따라 : Find overlapping (date/time) rows within one table

내가 1 단계하지만 2 단계는 나를 당황 떠나했다!

정말 고맙겠습니다. 감사!

편집 : 나는 씨 렌쇼의 답변을 읽고 있었다 나는 이해하면 내 자신에 대한 하나의 볼 일을 시도하고 나는 개념을 가지고 :

SELECT 
    a.* 
FROM 
    (SELECT 
    b.creation_date, 
    b.booking_id, 
    r_b.resource_id, 
    b.booking_start, 
    b.booking_end 
    FROM Booking b 
    INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as a, 
    (SELECT 
    b.booking_id, 
    r_b.resource_id, 
    b.booking_start, 
    b.booking_end 
    FROM Booking b INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as 
WHERE 
    a.resource_id = b.resource_id 
AND 
    a.booking_id <> b.booking_id 
AND 
    a.booking_start BETWEEN b.booking_start AND b.booking_end 
AND 
    a.creation_date >= b.creation_date 

내가이 개 동일한 테이블을 만들려고했다 생각 을 그들을 resource_id와 조인하고 비슷한 resource id를 가지고 있지만 다른 booking_id를 가진 레코드를 찾아서 하나의 booking_start datetime이 다른 하나의 예약 _ 시작과 booking_end 사이에 있는지 확인하십시오 (booking_id).

정말 지저분하고 내 쿼리가 내 마음에 무엇이 있는지 묻고 있지만 기적으로 볼 때 미스터 렌쇼와 같은 대답이 있습니다.

답변

1

편집 : 추가 정보를 사용하여 일부 어리 어어 예약과 충돌하는 예약 만 표시 할 수 있습니다.

나는이 트릭을 할거다 생각 :

SELECT DISTINCT 
    b2.booking_id, -- The later booking 
    b2.booking_start, 
    b2.booking_end, 
    b2.creation_date, 
    rb1.resource_id, -- The resource over which the two bookings clash 
    b1.booking_id, -- The earlier booking 
    b1.booking_start, 
    b1.booking_end 
FROM resource_booked rb1 
    INNER JOIN booking b1 ON b1.booking_id = rb1.booking_id 
    INNER JOIN booking b2 ON b1.booking_id <> b2.booking_id 
     AND b2.booking_start BETWEEN b1.booking_start AND b1.booking_end 
    INNER JOIN resource_booked rb2 ON rb2.resource_id = rb1.resource_id 
     AND rb2.booking_id = b2.booking_id 

이이 테스트되었습니다 방법입니다

use tempdb 

drop table resource_booked 
drop table Booking 

create table Booking 
(
    booking_id int, 
    booking_start datetime, 
    booking_end datetime, 
    creation_date datetime 
) 

create table resource_booked 
(
    booking_id int, 
    resource_id int 
) 

insert Booking values (1, '1 january 2000', '1 march 2000', '1 january 2000') 
insert Booking values (2, '1 february 2000', '1 may 2000', '2 january 2000') 
insert Booking values (3, '1 april 2000', '1 june 2000', '3 january 2000') 
insert Booking values (4, '1 july 2000', '1 august 2000', '4 january 2000') 

insert resource_booked values (1, 1) 
insert resource_booked values (2, 1) 
insert resource_booked values (3, 1) 
insert resource_booked values (4, 1) 
insert resource_booked values (1, 2) 
insert resource_booked values (3, 2) 
+0

몇 가지 이유로 특정 레코드의 'duplicates'가 나타납니다. * b2.booking_id | b2.creation_date | rb1.resource_id | b1.creation_date | b1.booking_id * ** 23 | 2006-08-31 13 : 21 : 25.0 | 12 | 2006-09-05 14 : 12 : 17.0 | 21 ** 그리고 아래 다른 줄 : ** 21 | 2006-09-05 14 : 12 : 17.0 | 12 | 2006-08-31 13 : 21 : 25.0 | 23 ** – Cuppy

+0

b1.creation_date> = b2.creation_date인지 확인하는 또 다른 WHERE 절을 추가하여 나중의 예약 만 표시하고 작동하는 것처럼 보입니다! 다시 한 번 감사드립니다! – Cuppy

0

와우! 나는 결코 그런 생각을하지 못했을 것입니다. 나는 그와 같은 상세한 도움을 기대하지 않았고, 당신이 그것에 끼워 넣은 모든 노력에 감사드립니다! >

예약 테이블에는 creation_date라는 또 다른 속성이 있습니다.이 속성은 예약이 이루어 졌음을 보여 주며 예약 (시간이 중복되거나 충돌이 있음) 만 표시하기를 원합니다. 나중에 만들어졌다. 그래서 것 :

Booking 1 
========= 
creation_date - 2000-01-01 13:00:00 
booking_start - 2000-02-24 12:00:00 
booking_end - 2000-02-24 14:00:00 

Booking 2 
========= 
creation_date - 2000-01-02 15:00:00 
booking_start - 2000-02-24 13:00:00 
booking_end - 2000-02-24 15:00:00 

예약 1과 2 사이 2 만 표시 될 2, 예약 한 예약보다 하루 나중에 만들어진 예약 이후 시간이 겹쳐있다.

+0

감사합니다. 그 지역을 포맷하는 데 문제가있었습니다! :> – Cuppy

+0

원본 질문에 편집과 같은 추가 정보를 추가하는 것이 좋습니다. 퀘스트 온과 관련된 설명 기능을 사용하여 토론을 수행 할 수 있습니다. –

+0

이 추가 정보를 고려하여 내 대답을 편집했습니다. –

관련 문제