2008-12-08 39 views
1

我有一个MySQL表LOGIN_LOG与字段ID,PLAYER,TIMESTAMP和ACTION。 ACTION可以是“登录”或“注销”。只有大约20%的登录有一个伴随注销行。对于那些,我想计算平均持续时间。SQL查询来计算从日志表的访问时间

我想的有点像

select avg(LL2.TIMESTAMP - LL1.TIMESTAMP) 
from LOGIN_LOG LL1 
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP 
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER 
    and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1 
    and LL3.ACTION = 'login' 
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID) 

这是做的最好的方法,还是有一个更有效率?

回答

1

考虑到您拥有的数据,您可能无法做得更快,因为您必须查看LOGIN和LOGOUT记录,并确保没有其他LOGIN(或LOGOUT?)记录两者之间的用户。

或者,找一种方法确保断开连接记录注销,以便数据完整(而不是完成20%)。但是,查询可能仍然需要确保满足条件,所以它不会帮助查询。

如果您可以将数据转换为LOGIN和相应LOGOUT时间都在同一记录中的格式,那么您可以非常简化查询。我不清楚SessionManager是否为你做。

0

您是否有可以超时会话的SessionManager类型对象?因为可以在那里记录超时,并且您可以从中获取最后一次活动时间和超时时间。

或者您登录网站/服务的所有活动,因此您可以直接查询网站/服务访问时间,并查看他们执行的活动。对于一个网站,Apache日志分析器可能会生成所需的统计信息。

0

我同意JeeBee,但SessionManager类型对象的另一个优点是可以处理sessionEnd事件并写入一个注销行,并在其中包含活动时间。这样,您可能会从20%的注销行到100%的注销行。查询活动时间对于所有会话来说都是微不足道的。

0

如果只有20%的用户实际注销,则此搜索不会为您提供每个会话的准确时间。衡量平均用户会话时间的更好方法是采取行动之间的平均时间或平均值。每页的时间。然后,这可以乘以每次访问的平均页数/动作,以提供更准确的时间。

此外,你可以确定平均。每个页面的时间,然后让你的会话结束时间=会话时间到那个点+平均时间花在他们的最后一页上。这会给你一个更细致(准确)的每个会话花费时间的度量。

关于给定的SQL,它似乎比你真正需要的更复杂。这种统计操作通常可以在数据库外部的代码中更好地处理/更易维护,您可以选择任何语言的全部功能,而不仅仅是用于统计计算的SQL的相当复杂的功能