2015-01-18 4 views
0

여러 세션 이벤트에 대한 레코드가있는 테이블이 있습니다. 각 행은 세션의 이벤트이고 세션은 동일한 이벤트의 배수가 될 수 있습니다. 이는 기본적으로 게임 세션이며 각 이벤트는 라운드 스타트 ​​또는 라운드 엔드입니다. 내 데이터는 다음과 같습니다.하위 쿼리 where 절의 열 참조

Session_id | Event_type | Event_Time 
1 | round_start | 12:01:00 
1 | round_end | 12:02:00 
1 | round_start| 12:05:00 
1 | round_end | 12:7:00 
2 | round_start | 14:11:00 
2 | round_end | 14:12:00 
3 | round_start| 15:09:00 
3 | round_end | 15:13:00 

평균 순환 기간을 찾으려고합니다. 다음 SQL을 시도했습니다

select 
RS.session_id, 
RS.Event_Time as StartTime, 
RE.EndTime, 
TIMESTAMPDIFF(MINUTE,RE.EndTime,RS.Event_Time) as duration 
from amp_event_mamlaka as RS 
left join 
(
    select session_id, min(event_time) as EndTimd from amp_event_mamlaka 
    where Event_Type = "Round End" and session_id = RS.session_id and event_time>RS.Event_Time 
) RE 
on RE.session_id = RS.session_id 

문제는 내가 조인 된 테이블에서 RS.session_id 및 RS.event_time을 참조 할 수 없다는 것입니다.

저는 MySQL을 사용하고 있습니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?

감사

+0

는 것, 그리고 뚜렷한 상처없는 것 중 하나는 분 SESSION_ID와 관련된 세트 내에서 중복 될 수 있다는 가능성이 있기 때문이다. – markg

답변

1

서브 쿼리 :

select RS.session_id, RS.Event_Time as StartTime, 
     (select smin(event_time) 
     from amp_event_mamlaka em 
     where em.session_id = RS.session_id and 
       em.Event_Type = 'Round End' and 
       em.event_time > RS.Event_Time 
     ) as EndTime, 
from amp_event_mamlaka RS; 

당신은 하위 쿼리를 사용하여 타임 스탬프 차이를 할 수 중첩 된 쿼리는 하나의 값만 반환해야합니다. 요구 사항은 행 쌍의 데이터를 원할 때의 예입니다. 하위 쿼리는 데이터를 제공하지 않고 쌍을 연결하는 데만 사용됩니다. 당신이 당신의 하위 쿼리에 의해 그룹이 필요한 것처럼 Fiddle

select e1.SessionID, e1.EventType, e1.EventTime, e2.EventType, e2.EventTime, TimeStampDiff(minute, e1.EventTime, e2.EventTime) Duration 
from Events e1 
join Events e2 
    on e2.SessionID = e1.SessionID 
    and e2.EventType = 'end' 
    and e2.EventTime =(
     select Min(EventTime) 
     from Events 
     where SessionID = e1.SessionID 
      and EventType = 'end' 
      and EventTime > e1.EventTime) 
where e1.EventType = 'start'; 
1

대신 subquerywhere 절에 그것을 유지하는 당신은 조건에 On 절을 가입 유지할 수 있습니다. 이 시도.

SELECT RS.session_id, 
     RS.Event_Time         AS StartTime, 
     RE.EndTime, 
     Timestampdiff(MINUTE, RE.EndTime, RS.Event_Time) AS duration 
FROM amp_event_mamlaka AS RS 
     LEFT JOIN (SELECT session_id, 
         Min(event_time) AS EndTimd 
        FROM amp_event_mamlaka 
        WHERE Event_Type = "Round End") RE 
       ON RE.session_id = RS.session_id 
       AND RE.event_time > RS.Event_Time 
난 당신이 상관 하위 쿼리와 함께이 접근 제안했다
2

하십시오 반대로,

select RS.*, TIMESTAMPDIFF(MINUTE, EndTime, Event_Time) as duration 
from (select RS.session_id, RS.Event_Time as StartTime, 
      (select min(event_time) 
       from amp_event_mamlaka em 
       where em.session_id = RS.session_id and 
        em.Event_Type = 'Round End' and 
        em.event_time > RS.Event_Time 
      ) as EndTime 
     from amp_event_mamlaka RS 
    ) RS