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

标签 php mysql optimization

大家好,我有一个 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(timestamp)右边的 table 。在外部查询中,只需总结 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

关于php - 计算每个用户在系统上消耗的时间的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36861415/

相关文章:

php - 是否有像 Google 提供网站图标这样的网站提供 apple-touch-icon 的服务?

php - 如何覆盖 suhosin 最大值?

python - 有效地检查一个元素是否在列表中至少出现 n 次

optimization - 为什么 NVRTC 不优化我的整数除法和模运算?

python - Pandas:将组转换为 json 列表,而不使用 groupby 或 apply

php - 将自定义数据库与 Wordpress 集成

php - bindParam 和 bindValue 不起作用?

android - 我可以使用 Firebase Auth 或 FaceBook 帐户套件代替 SMSprovider 吗?

php - 在服务器上启用 PDO,还是不使用 Laravel?

php - 如何在cakephp中的另一个条件中使用条件