我有一张桌子“Log” 当有人登录服务器时,我的游戏服务器会在此表中插入记录,然后在他们注销时插入第二条记录。 我想要做的是创建一个查询来计算登录的人数。
插入表“Log”的主要数据
登录后
[Type] = 0
[Player1] = Their account ID
[Value2] = a random number which matches the logout row when they logout
[Value3] = 0
退出时:
[Type] = 1
[Player1] = Their account ID
[Value2] = a random number which matches the login row when they logout
[Value3] = some random number
有没有办法可以计算每个帐户的最后一个“Player1”并检查“Type”是否为0,这意味着帐户已登录,然后回显结果。
我正在寻找的结果会将每个帐户的最后一条记录计算在内。
注意:每次帐户登录和退出时都会插入2条记录,因此,如果1个帐户登录20次,则“日志”中将有40条记录
答案 0 :(得分:1)
这样做的一种方法是计算所有类型为0的行,这些行不存在具有相同播放器和更晚日期的任何类型1行:
select count(*) as number_of_logged_in
from log l
where Type = 0 -- 0 meaning log on event
-- and [Value3] = 0 -- maybe this should be included
and not exists (
select 1 from log
where Player1 = l.Player1
and type = 1 -- 1 meaning log out event
and date > l.date
-- and [Value2] = l.[Value2] -- maybe this should be included
);
我发现你的问题陈述有点令人困惑,因为你说你想要计算登录的人数,但是你说我想计算每个[Player!]的最后一个[Type]是1 ,这似乎是相反的。它也不清楚为什么随机数很重要 - 如果用户的最后一个记录类型是0那么它们应被视为已登录,或者?
带有一些演示数据的答案 1 :(得分:0)
我假设你想要所有已登录玩家名单的列表,所以你可以尝试使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="http://www.example.com/" width="900px" data-featherlight="iframe">Release the iFrame</a>
来获得你想要的东西,
ROW_NUMBER()
答案 2 :(得分:0)
如果您知道,所有登录和注销都存储在Log
中没有间隙,您可以简单地计算它们,如果存在差异,您知道该播放器当前已登录。
SELECT logins.player1, logouts.cnt - logins.cnt
FROM
(select player1, count(*) as cnt from Log where type = 0 group by player1) as logins
LEFT OUTER JOIN
(select player1, count(*) as cnt from Log where type = 1 group by player1) as logouts
ON (logins.player1 = logouts.player1)
WHERE logins.cnt > logouts.cnt or logouts.player1 is null
如果玩家一次登录并且从未退出,则需要left outer join
。对不起,如果您遇到语法问题。我只是在没有测试的情况下编写了这个,并且通常在那里使用Teradata系统和SQL Dialect。但是由于这里给出的SQL是简单的Ansi,它应该适用于任何数据库。