计算系统上每个用户消耗的时间的有效方法


Efficient way to calculate the time consumed by each user on a system

大家好,我有一个看起来像这样的 mySQL 表:

|Id |username           |timestamp              |timestring     |
+---+-------------------+-----------------------+---------------+
|4  |user1              |2016-02-11 11:50:21    |20160211115021 |
|3  |user3              |2015-12-04 15:55:46    |20151204155546 |
|2  |user2              |2015-12-03 19:54:48    |20151203195448 |
|1  |user1              |2015-11-27 10:24:30    |20151127102430 |
+---+-------------------+-----------------------+---------------+

这将在互斥面板上显示访问日志(每次只有一个人可以保持登录状态)。我想做的是有一些统计数据,其中大多数都非常简单,但我很难计算在面板上花费的时间,我想知道每个用户,他/她"阻止"了多少时间系统。

实际上,我

正在创建一个用户名数组,其中我逐渐汇总用户从"下一个"(由 id 获取)的所有秒数。

我觉得这对系统来说非常耗时,我想有一种更有效的方法,有没有办法使用 mySQL 获得它,或者最好构建一个新表,我只需在其中存储所有用户名并时不时添加时间?还是使用PHP更好?

我必须考虑到mySQL是一个共享的,所以我的资源不是无限的。

通常,我会创建一个子查询,该子查询使用 id 字段将表本身连接起来,其中右侧表中的 id 大于左侧的 id,并从右侧表中获取 min(时间戳)。在外部查询中,只需总结 2 个时间戳之间的差异:

select t.username, sum(t.endtime-t.starttime) as seconds
from
    (select t1.id, t1.username, t1.timestamp as starttime, min(t2.timestamp) as endttime
    from yourtable t1
    left join yourtable t2 on t1.id<t2.id
    group by t1.id, t1.username, t1.starttime) t
group by t.username

如果您知道 id 字段中没有间隙,则可以简化查询:

select t1.username, sum(t2.timestamp-t1.timestamp) as second 
from yourtable t1
left join yourtable t2 on t1.id+1=t2.id
group by t1.username