用于确定哪些用户在线的SQL查询

时间:2013-08-01 19:53:44

标签: mysql sql

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

基本上有一个名为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值为0的PlayerUID列表的内容,从而为我提供当前在线的所有玩家。

3 个答案:

答案 0 :(得分: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处理:这是为了处理第一次登录但从未注销的玩家。

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

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

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