我正在尝试获取登录在线游戏(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列表的内容,从而为我提供当前在线的所有玩家。
答案 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