2016-04-26 44 views
1

好日子都在,我有一个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是一个共享的,所以我的资源不是无限的。

回答

1

一般来说,我会创建一个子查询,它使用id字段将自己的表连接到自己的表中,其中右侧表的id大于左侧的id,并从中获取min(timestamp)右边的桌子。在外部查询只是总结差的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 
+0

看起来真的很好,我不能以任何方式去想它(我没那么有经验,而且我至少可以做一些连接),我会试着去理解它的表现,但看起来非常整齐。 –

+0

@RickJames你的意思是第二个,因为第一个仍然可以工作。而且我确实指出,第二种解决方案只有在ID中没有缺口的情况下才能起作用。 – Shadow

+0

糟糕;你是对的。我会删除我的评论。 –

相关问题