2013-08-01 6 views
0

온라인 게임 (DayZ)에 로그인 한 플레이어의 목록을 얻으려고합니다. 백엔드 데이터베이스는 MySQL이며 사용자가 로그인했는지 여부를 확인하는 방법은 간단하지 않습니다. 내가이 도움말을 사용할 수있는 쿼리를 작성하고 있습니까?온라인 사용자를 확인하는 SQL 쿼리

기본적으로 플레이어가 시스템에 로그인하거나 로그 아웃 할 때마다 새로운 항목을 만드는 테이블이 player_login입니다. 사용자가 로그인하면 이라는 필드가 2으로 설정됩니다. 사용자가 로그 아웃하면 action 필드는 0으로 설정됩니다. 결과는 다음 0 경우 몇 가지 smaple (단순화) 데이터

LoginID  PlayerUID DateStamp    Action 
126781  79067462 2013-08-01 13:16:28  0 
126777  79067462 2013-08-01 12:59:22  2 
126775  79067462 2013-08-01 12:42:10  0 
126774  79067462 2013-08-01 12:41:34  2 
126773  79067462 2013-08-01 12:38:38  0 
단일 사용자가 다음 쿼리를 통해 로그인하면 내가 찾아 테이블을 조회 할 수 있습니다

..

SELECT PlayerUID, Action 
FROM player_login 
WHERE PlayerUID = 79067462 
ORDER BY Datestamp DESC 
LIMIT 1 

입니다 플레이어가 마지막으로 한 것은 로그인 이었으므로 온라인 상태입니다. 값이 2이면 플레이어가 마지막으로 한 일은 로그 아웃이므로 오프라인 상태입니다. 내가 어려움을 겪고있는 것은이 쿼리를 최신 Action 값이 0 인 PlayerUID 목록으로 반환하여 현재 모든 플레이어에게 온라인으로 제공하는 것으로 변환하는 것입니다.

+0

합니다. –

+0

@DanJ 당신 궁금하지 않니? –

+0

호기심에 의해서만, "로그인"하지만 명시 적으로 "로그 아웃"하지 않는 사용자를 어떻게 처리합니까 - 연결이 끊어 졌기 때문에 말합니까? –

답변

3

다음 쿼리는 각 선수에 대한 가장 최근의 로그 아웃 시간을 산출하십시오 : Action = 2

SELECT PlayerUID, MAX(DateStamp) AS MostRecentLogout 
FROM player_login 
WHERE Action = 0 
GROUP BY PlayerUID 

유사한 쿼리가 모두 가장 최근 로그인 시간을 산출한다. 이러한 결합은 당신이 그들을 비교할 수 :

SELECT plin.PlayerUID, plin.MostRecentLogin, plout.MostRecentLogout, 
     CASE WHEN plout.MostRecentLogout IS NULL 
       OR plout.MostRecentLogout < plin.MostRecentLogin 
      THEN 1 
      ELSE 0 
     END AS IsPlayerLoggedIn 
FROM (SELECT PlayerUID, MAX(DateStamp) AS MostRecentLogin 
     FROM player_login 
     WHERE Action = 2 
     GROUP BY PlayerUID) plin 
LEFT JOIN (SELECT PlayerUID, MAX(DateStamp) AS MostRecentLogout 
      FROM player_login 
      WHERE Action = 0 
      GROUP BY PlayerUID) plout ON plout.PlayerUID = plin.PlayerUID 

참고 LEFT은 가입하고 CASE 문에서 승무원 NULL 처리 :이가 처음으로 로그인 아직 로그 아웃 적이없는 선수를 처리하기위한 것입니다.

+0

대단히 감사합니다. 잘 설명했다. 방금 결과를 로그 인한 사용자로 제한하는 문장 (코드에서 수집 한 문장)을 다음과 같이 추가했습니다. WHERE (plout.MostRecentLogout IS NULL 또는 plout.MostRecentLogout NOW() - INTERVAL 1 DAY)' – webworm

0

SELECT PlayerUID, Action 
    FROM player_login 
    WHERE `Action` = 0 
    GROUP BY PlayerUID 
    ORDER BY Datestamp DESC 
+0

이것은 각 사용자가 현재 로그인했는지 여부가 아니라 마지막으로 로그인 한 시간을 표시합니다. –

0

은 당신이 별개의 플레이어에 의해 정렬 할 생각 ID를, 그렇지 않으면 당신은 플레이어가 또는 로그 아웃 한 모든 시간을 얻을 것이다 : 조금 불필요 주제 넘은이다

SELECT DISTINCT PlayerUID, Action 
FROM player_login 
WHERE 'Action' = 0 
ORDER BY Datestamp DESC 
+0

이것은 현재 로그인 한 플레이어가 아닌 시스템에 로그인 한 모든 플레이어를 표시합니다. –

관련 문제