0

我正在尝试获取登录在线游戏(DayZ)的玩家列表。后端数据库是 MySQL,确定用户是否登录的方法并不完全直接。Is 正在构建这个我可以使用帮助的查询。

基本上有一个名为的表player_login,每次玩家登录和退出系统时都会创建一个新条目。如果用户登录,则名为的字段action设置为2。如果用户注销,则该action字段设置为0。这是一些简单的数据(简化)

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

如果结果是0玩家做的最后一件事是登录,因此是在线的。如果该值是2玩家所做的最后一件事是注销并因此处于离线状态。我遇到的一些困难是将此查询转换为返回最新Action值所在的 PlayerUID 列表的内容0,从而为我提供当前在线的所有玩家。

4

3 回答 3

3

以下查询为每个玩家生成最近的注销时间:

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

一个类似的查询Action = 2会产生所有最近的登录时间。结合这些可以让您比较它们:

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

注意 CASE 语句中的 LEFT JOIN 和伴随的 NULL 处理:这意味着处理第一次登录但从未注销的玩家。

于 2013-08-01T20:01:53.393 回答
0

尝试这个

   SELECT PlayerUID, Action
   FROM player_login 
   WHERE `Action` = 0
   GROUP BY PlayerUID
   ORDER BY Datestamp DESC 
于 2013-08-01T19:56:08.607 回答
0

我认为您想按不同的玩家 ID 进行排序,否则您将获得玩家登录或注销的所有时间:

SELECT DISTINCT PlayerUID, Action
FROM player_login
WHERE 'Action' = 0
ORDER BY Datestamp DESC
于 2013-08-01T20:01:56.307 回答