美好的一天,我有一个看起来像这样的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是一个共享的,所以我的资源不是无限的。
答案 0 :(得分:1)
一般情况下,我会创建一个子查询,使用id字段将表连接到自身,其中右侧表的id大于左侧的id,并从中获取min(时间戳)右手边的桌子。在外部查询中只是总结了两个时间戳之间的差异:
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