【发布时间】:2013-03-24 10:01:55
【问题描述】:
假设我有一个如下所示的 MySQL 表,我在其中跟踪用户 (User.id) 何时(日期)阅读我网站上的文章 (Article.id):
------------------------------------------
Article_Impressions
------------------------------------------
date | user_id | article_id
--------------------+---------+-----------
2013-04-02 15:33:23 | 815 | 2342
2013-04-02 15:38:21 | 815 | 108
2013-04-02 15:39:33 | 161 | 4815
...
我正在尝试确定我有多少会话,以及给定日期每个用户的平均会话持续时间。当一篇文章在另一篇文章之后 30 分钟内没有被阅读时,会话结束。
问题
我如何才能有效地确定我在某一天有多少会话?我正在使用 PHP 和 MySQL。
我的第一个想法是查询给定日期的所有数据,按用户排序。然后我遍历每个用户,检查一次印象是否在最后一次印象的 30 分钟内,并统计每个用户当天的会话总数。
由于我们的网站每天有大约 200 万次展示,因此我正在尝试优化此报告生成器。
【问题讨论】:
-
学习使用 GROUP BY 和 MySQL 聚合函数...这将是一个起点 - 不要尝试在 PHP 中完成所有工作
-
我同意 Mark Baker 的观点,我会在 SQL 中做尽可能多的事情,可能会使用视图。您至少应该能够获得会话总数,但可能还可以获得每个用户的平均时间。
-
我非常了解 MySQL。我肯定打算使用 MySQL 对数据进行排序和排序,但想不出任何其他方法。如何使用纯 SQL 按 30 分钟的存储桶对数据进行分组?做不到……
-
将日期/时间转换为 unix 时间戳,除以 30 分钟,然后转换为整数,然后分组...将为您提供 30 分钟的存储桶
-
但是会话是相对于上一次访问的,所以我需要查看上一次访问的时间,以确定从那时起已经过去了 30 分钟。如果用户每 29 分钟访问一个页面 100 次,这将被视为一个非常长的单次会话。部门/演员不会考虑到这一点......
标签: php mysql algorithm logging analytics