gpt4 book ai didi

mysql - SQL 查询以确定哪些用户在线

转载 作者:太空宇宙 更新时间:2023-11-03 12:25:13 24 4
gpt4 key购买 nike

我正在尝试获取已登录在线游戏 (DayZ) 的玩家列表。后端数据库是 MySQL,确定用户是否登录的方法并不完全直接。 Is is building this query that I could use help with.

基本上有一个名为 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,那么玩家所做的最后一件事就是注销并因此处于离线状态。我遇到的困难是将此查询转换为返回 PlayerUID 列表的内容,其中最新的 Action 值为 0,从而为我提供当前在线的所有玩家。

最佳答案

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

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 处理:这是为了处理首次登录但从未退出的玩家。

关于mysql - SQL 查询以确定哪些用户在线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com