사용자 이름, 동작 (중지, 시작, 일시 중지) 및 작업 타임 스탬프를 저장하는 테이블이 있습니다.MySQL 마지막 동작이 '중지되지 않음'
따라서 열이 userid
, name
, action
내가 활성 사용자를받을 수 있나요 어떻게 timestamp
있습니다. 나는. 마지막 작업 인 사용자가 '중지'하지 않았습니다.
(작동하는 게시 대신) 쿼리를 구성하고 /하거나 올바른 방향으로 나를 가리켜 주도록 도와 주셔서 감사드립니다.
사용자 이름, 동작 (중지, 시작, 일시 중지) 및 작업 타임 스탬프를 저장하는 테이블이 있습니다.MySQL 마지막 동작이 '중지되지 않음'
따라서 열이 userid
, name
, action
내가 활성 사용자를받을 수 있나요 어떻게 timestamp
있습니다. 나는. 마지막 작업 인 사용자가 '중지'하지 않았습니다.
(작동하는 게시 대신) 쿼리를 구성하고 /하거나 올바른 방향으로 나를 가리켜 주도록 도와 주셔서 감사드립니다.
Select
에 대한 MySQL의에서 HAVING
문을 조회. 이 경우 timestamp = max(timestamp)
인 동일한 레코드에서 다른 필드를 선택할 수 없습니다. 집계 함수없이 집계 쿼리 필드를 사용할 수 없기 때문입니다.
그래서 사용자의 마지막 작업 시간을 선택하려면 일종의 하위 쿼리가 필요합니다. 또한 join
에만 timestamp
및 userid
으로 연결할 수 있습니다.
이제 쿼리에 :
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'
나는 사용자가 많은 활동이있을 수 있으므로 어려움이 오면 보장 :
1 00002323는 mjuaji가 시작,
1, mjuaji을 중지 00002324
1 , mjuaji, 일시 중지, 00002325
음, 올바른 방향으로 안내합니다. :
각 사용자의 마지막 동작을 선택하는 방법은 먼저입니다. 그룹화, 합계 연산자 (최대, 최소 ...)
그런 다음 마지막 작업이 "중지"가 아닌지 확인하십시오. 이 당신에게 사용자의 마지막 작업 (그룹 당 최대 timestamp
와 동작을) 줄 것이다 -
당신은 최대 timestamp
에 의해 그룹의 모든 userid
에 의해 데이터, 질서가있는 SELECT 문을 작성해야합니다.
이제 남은 작업은 정지 조치가없는 그룹을 마지막 작업으로 필터링하는 것입니다.
max(timestamp)
쿼리 필드로 집계 쿼리를 의미 action
필드의 마지막 값을 보내고 필터링 부분나는 질문을 게시하기 전에이 이전 시도했다. Victors가 대답하는 이유가 이것이 작동하지 않는 이유를 설명합니다. – artfullyContrived
'group by actions.userid'를 추가 한 후 매력처럼 작동합니다. 그러나 나는 아직도 최종 그룹이 필요한 이유를 이해하지 못한다. – artfullyContrived
'group by'은'max()'가 작동하도록해야합니다 - 쿼리에서 이들 중 하나 (aggergate 함수) 중 하나를 사용하면 모든 필드에서 'group by'또는 다른 aggergate 함수를 사용해야합니다. 그렇지 않으면, DBMS는 반환 할 동일한'timestamp '를 가진 레코드의'userid'를 결정할 수 없습니다. 그것은'lastActions' 하위 쿼리에서 제가하는 일입니다. –
그냥 명확하게. 작동하게하려면'actions.userid'를'actions.action! = 'stop' 뒤에 추가해야했습니다. 추가하지 않으면 잘못 계산됩니다. 그것이 그 집단에 의한 그룹이 수수께끼로 남아있다. – artfullyContrived