문제

나는 MySQL 테이블 LOGIN_LOG 필드 ID,플레이어,타임스탬프 및 작업입니다.작업을 할 수 있습니다거나'로그인'또는'logout'.만 약 20%로그인이 함께 로그아웃 행이 있습니다.않는 사람들을 위해,나는 원하는 평균을 계산하는 기간이 있습니다.

나의 생각은 뭔가

select avg(LL2.TIMESTAMP - LL1.TIMESTAMP)
from LOGIN_LOG LL1
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER
  and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1
  and LL3.ACTION = 'login'
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID)

이것이 최선의 방법으로 그것을 하나,거기에 하나 더 효율적입니까?

도움이 되었습니까?

해결책

당신이 가진 데이터를 감안할 때, 로그인과 로그 아웃 레코드를보고 두 사람 사이에 동일한 사용자에 대한 다른 로그인 (또는 로그 아웃) 레코드가 없어야하기 때문에 할 수있는 더 빠른 일이 없을 것입니다. .

또는 연결 끊기가 로그 아웃을 기록하여 데이터가 완료되도록 (20% 완료된 대신) 로그 아웃을 기록하는 방법을 찾으십시오. 그러나 쿼리는 아마도 기준이 모두 충족되도록해야 할 것이므로 쿼리에 많은 도움이되지는 않습니다.

로그인 및 해당 로그 아웃 시간이 동일한 레코드에있는 형식으로 데이터를 가져올 수 있다면 쿼리를 엄청나게 단순화 할 수 있습니다. SessionManager가 당신을 위해 그렇게하는지 확실하지 않습니다.

다른 팁

당신은 SessionManager 형식 개체할 수 있는 시간 제한 세션?기 때문에 시간 제한으로 로그인한 상태이며,당신이 얻을 수있는 지난 활동에서 시간과 시간 제한 기간입니다.

또는 당신이 로그는 모든 활동에서 웹사이트를 서비스하고,따라서 쿼리할 수 있습 웹사이트/서비스를 방문하는 시간을 직접 볼,어떤 활동들을 수행됩니다.웹사이트에 대한 아파치 로그인 분석기로 수 있습니다 아마 생성이 필요합니다.

Jeebee에 동의하지만 SessionManager 유형 객체의 또 다른 장점은 SessionEnd 이벤트를 처리하고 활성 시간이있는 로그 아웃 행을 작성할 수 있다는 것입니다. 이렇게하면 로그 아웃 행을 동반하는 20%에서 로그 아웃 행과 함께 100%로 이동할 수 있습니다. 그런 다음 활동 시간에 대한 쿼리는 모든 세션에 대해 사소하고 일관됩니다.

사용자의 20% 만 실제로 로그 아웃하면이 검색이 각 세션의 정확한 시간을 제공하지 않습니다. 평균 사용자 세션이 얼마나 오래 걸리는지를 측정하는 더 좋은 방법은 작업 또는 AVG 사이의 평균 시간을 보는 것입니다. 페이지 당 시간. 그러면 방문 당 평균 페이지/작업 수를 곱하여보다 정확한 시간을 제공 할 수 있습니다.

또한 AVG를 결정할 수 있습니다. 각 페이지의 시간을 다음, 세션 종료 시간 = 세션 시간을 해당 지점까지 + 마지막 페이지에 소비 한 시간을 얻습니다. 이렇게하면 세션 당 훨씬 더 세밀한 (그리고 정확한) 시간을 보낼 수 있습니다.

주어진 SQL과 관련하여 실제로 필요한 것보다 더 복잡한 것 같습니다. 이러한 종류의 통계적 운영은 종종 데이터베이스 외부 코드에서 더 잘 처리/보수가 가능할 수 있으며, 이는 통계 계산을위한 SQL의 다소 복잡한 능력이 아니라 선택한 언어의 전체 힘을 가질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top