2011-03-10 6 views
0

사용자 이름, 동작 (중지, 시작, 일시 중지) 및 작업 타임 스탬프를 저장하는 테이블이 있습니다.MySQL 마지막 동작이 '중지되지 않음'

따라서 열이 userid, name, action 내가 활성 사용자를받을 수 있나요 어떻게 timestamp

있습니다. 나는. 마지막 작업 인 사용자가 '중지'하지 않았습니다.

(작동하는 게시 대신) 쿼리를 구성하고 /하거나 올바른 방향으로 나를 가리켜 주도록 도와 주셔서 감사드립니다.

답변

1

Select에 대한 MySQL의에서 HAVING 문을 조회. 이 경우 timestamp = max(timestamp) 인 동일한 레코드에서 다른 필드를 선택할 수 없습니다. 집계 함수없이 집계 쿼리 필드를 사용할 수 없기 때문입니다.

그래서 사용자의 마지막 작업 시간을 선택하려면 일종의 하위 쿼리가 필요합니다. 또한 join에만 timestampuserid으로 연결할 수 있습니다.

이제 쿼리에 :

select actions.userid, actions.action 
from actions 
    inner join (select max(timestamp) timestamp, userid from actions group by userid) lastActions 
    on actions.userid = lastActions.userid and actions.timestamp = lastActions.timestamp 
where actions.action != 'stop' 
+0

'group by actions.userid'를 추가 한 후 매력처럼 작동합니다. 그러나 나는 아직도 최종 그룹이 필요한 이유를 이해하지 못한다. – artfullyContrived

+0

'group by'은'max()'가 작동하도록해야합니다 - 쿼리에서 이들 중 하나 (aggergate 함수) 중 하나를 사용하면 모든 필드에서 'group by'또는 다른 aggergate 함수를 사용해야합니다. 그렇지 않으면, DBMS는 반환 할 동일한'timestamp '를 가진 레코드의'userid'를 결정할 수 없습니다. 그것은'lastActions' 하위 쿼리에서 제가하는 일입니다. –

+0

그냥 명확하게. 작동하게하려면'actions.userid'를'actions.action! = 'stop' 뒤에 추가해야했습니다. 추가하지 않으면 잘못 계산됩니다. 그것이 그 집단에 의한 그룹이 수수께끼로 남아있다. – artfullyContrived

0

나는 사용자가 많은 활동이있을 수 있으므로 어려움이 오면 보장 :

1 00002323는 mjuaji가 시작,

1, mjuaji을 중지 00002324

1 , mjuaji, 일시 중지, 00002325

음, 올바른 방향으로 안내합니다. :

각 사용자의 마지막 동작을 선택하는 방법은 먼저입니다. 그룹화, 합계 연산자 (최대, 최소 ...)

그런 다음 마지막 작업이 "중지"가 아닌지 확인하십시오. 이 당신에게 사용자의 마지막 작업 (그룹 당 최대 timestamp와 동작을) 줄 것이다 -

1

당신은 최대 timestamp에 의해 그룹의 모든 userid에 의해 데이터, 질서가있는 SELECT 문을 작성해야합니다.

이제 남은 작업은 정지 조치가없는 그룹을 마지막 작업으로 필터링하는 것입니다.

  • 힌트은 - max(timestamp) 쿼리 필드로 집계 쿼리를 의미 action 필드의 마지막 값을 보내고 필터링 부분
+0

나는 질문을 게시하기 전에이 이전 시도했다. Victors가 대답하는 이유가 이것이 작동하지 않는 이유를 설명합니다. – artfullyContrived

관련 문제