2011-07-05 2 views
0

이것은 이전의 questions 중 하나를 벗어나 빌드 된 질문입니다. 표는 동일합니다 :시간 충돌이있는 사용자를 쿼리하고 해당 시간 충돌을 반환해야합니다.

Users 
------------------------------------ 
UserID | Name  | Assignable 
------------------------------------ 
    5 | John Doe |  1 

TimeSlots 
------------------------------------------------------- 
TimeSlotID | StartTime   | EndTime 
------------------------------------------------------- 
    3  | 2011-06-30 15:00:00 | 2011-06-30 16:00:00 

Appointments 
------------------------------------ 
TimeSlotID | UserID 
------------------------------------ 
    3  | 5 

허용 된 대답을 통해 특정 기간 동안 사용할 수 있었던 사용자를 찾을 수있었습니다. 시작 날짜/시간 및 종료 날짜/시간을 입력하고 시작 날짜/종료 시간에 시작 날짜/종료 날짜 사이에있는 을 반환하는 방법이 필요합니다. 그러나 나는 그것이 그렇게, 사용자가 구성 할 필요가 :

만약 내가 종료 날짜의 시작 날짜와 2011-07-07, 종료 시간의 시작 시간과 19:00에 대한 다음 I 입력 07:00의 입력 2011-07-05. 두 명의 사용자 (사용자 1과 사용자 2)가 있는데, 하나는 Appointments이고 다른 하나는 Appointment2011-07-06 11:00입니다. 내가 할 결과를해야 뭔가 같은 :

사용자 1 : NULL
사용자 2 : (TimeSlots 충돌의 배열)

편집 : 나는 시작 충분히 분명했다 경우는 몰라/종료 날짜와 시간. 시작일과 종료일 사이의 각 날짜 (시작일과 종료일) 사이의 충돌을 찾습니다.

+0

이 될 것입니다. 안녕하세요, 3-4 행의 데이터를 입력하여 조금 더 설명해야한다고 생각합니다. 그가 임명되지 않은 경우 당신이 어떻게 사용자를 인식 할 수 있는지 이해하지 못하기 때문에. 사용자가 지정하지 않은 경우 어떻게 충돌 할 것입니까? – Chandresh

답변

1

이전의 대답에 약간의 수정 - 당신의 간격으로 시작하는 타임 슬롯을 잡아 (여전히 기술적으로 당신의 정의에 충돌) 뒤에 종료 또는 간격 전에 시작하고시 종료 :

SELECT 
    UserID 
    GROUP_CONCAT(CONCAT(StartTime, ' - ', EndTime)) slots 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND (ts.EndTime > @start AND ts.StartTime > @end 
      OR ts.EndTime between @start and @end 
      OR ts.StartTime between @start and @end) 
    ) 
GROUP BY 
    UserID 
ORDER BY 
    UserID 

연결을 사용하지 않으려면 각 타임 슬롯을 반환하고 결과를 PHP 코드의 배열로 변환하십시오. 이 경우 SQL은

SELECT 
    UserID, 
    CONCAT(StartTime, ' - ', EndTime) slot 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND (ts.EndTime > @start AND ts.StartTime > @end 
      OR ts.EndTime between @start and @end 
      OR ts.StartTime between @start and @end) 
    ) 
ORDER BY 
    UserID, StartTime 
1

MySQL은 배열을 반환 할 수는 없지만 다음과 긴밀한 올 수 있습니다 :

SELECT 
    UserID, 
    GROUP_CONCAT(CONCAT(StartTime, ' - ', EndTime)) slots 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND ts.EndTime > @start 
     AND ts.StartTime > @end 
    ) 
GROUP BY 
    UserID 

이 사용자 당 시간 슬롯의 당신에게 쉼표로 구분 된 목록을 제공 (또는 NULL)됩니다.

관련 문제