代码之家  ›  专栏  ›  技术社区  ›  eliego

从日志表计算访问持续时间的SQL查询

  •  1
  • eliego  · 技术社区  · 16 年前

    我有一个MySQL表登录日志,其中包含ID、PLAYER、TIMESTAMP和ACTION字段。操作可以是“登录”或“注销”。只有大约20%的登录名有相应的注销行。对于那些这样做的,我想计算平均持续时间。

    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)
    

    这是最好的方法,还是有更有效的方法?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Jonathan Leffler    16 年前

    鉴于您拥有的数据,您可能无法更快地执行任何操作,因为您必须查看登录和注销记录,并确保这两个记录之间没有相同用户的其他登录(或注销?)记录。

    或者,找到确保断开连接记录注销的方法,以便数据完整(而不是20%完整)。但是,查询可能仍然必须确保满足所有条件,因此它对查询没有多大帮助。

        2
  •  0
  •   JeeBee    16 年前

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

    或者您将所有活动记录在网站/服务上,这样您就可以直接查询网站/服务访问持续时间,并查看他们执行了哪些活动。对于网站,Apache日志分析器可能会生成所需的统计信息。

        3
  •  0
  •   Bent André Solheim    16 年前

    我同意JeeBee的观点,但是SessionManager类型对象的另一个优点是,您可以处理sessionEnd事件并编写一个包含活动时间的注销行。这样,您可能会从20%的伴随注销行变为100%的伴随注销行。查询活动时间对于所有会话来说都是琐碎且一致的。

        4
  •  0
  •   cdeszaq Sudhir N    16 年前

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

    此外,您可以确定每个页面的平均时间,然后获得会话结束时间=到该点的会话时间+在最后一页上花费的平均时间。这将为您提供对每个会话花费的时间的更细粒度(和准确)的度量。

    对于给定的SQL,它似乎比您真正需要的更复杂。在数据库外部的代码中,这类统计操作通常可以得到更好的处理/更易于维护,在数据库中,您可以拥有所选语言的全部功能,而不仅仅是SQL在统计计算方面相当复杂的功能