我正在尝试计算 Piwik 跟踪的网站上用户操作的时长。 session 数据存储在 MySQL 表“log_visit_action”中。
在“time_spent_action”列中,我想计算用户在采取下一步行动或离开网站之前花费的时间(没有为“idvisit”分配进一步的行动)。
在 Excel 中我会知道如何解决问题。本身并不难。但是因为我是 MySQL 的新手,所以我不知道如何在这个有 5000 万个条目的 MySQL 表上实现它。也许您可以提供一些代码示例?
这是我导出到Excel的表格结构截图。 在这里您可以找到关于 sqlfiddle 的一些示例数据.
非常感谢, 拉斯
最佳答案
我最近遇到了同样的问题。因此,这里有一个解决方案,使用临时表。实际上,我提供了两种解决方案。
方案(A)使用子查询识别后续的log_action_link(非常耗时)
# Very time-consuming
CREATE TEMPORARY TABLE tmp
(INDEX idlink_follow (idlink_follow))
SELECT idlink_va, time_spent_ref_action AS time_spent_action, idvisit, (
SELECT idlink_va FROM piwik_log_link_visit_action b
WHERE (a.idvisit = b.idvisit) AND (b.idlink_va < a.idlink_va)
ORDER BY idlink_va
LIMIT 1
) AS idlink_follow
FROM piwik_log_link_visit_action a
ORDER BY idvisit DESC, idlink_va DESC;
解决方案 (B) 取决于干净且完整的 piwik_log_link_visit_action
表。通常是这种情况,但您永远无法完全确定。
# Create table containing the time per action
# (requires a clean and complete piwik_log_link_visit_action)
CREATE TEMPORARY TABLE tmpA
SELECT idlink_va, time_spent_ref_action, idvisit
FROM piwik_log_link_visit_action
ORDER BY idvisit, idlink_va;
SELECT * FROM tmpA;
SET @lagID = NULL;
CREATE TEMPORARY TABLE tmp
(INDEX idlink_follow (idlink_follow))
SELECT @lagID AS idlink_follow, time_spent_ref_action AS time_spent_action, @lagID:=idlink_va AS idlink_va
FROM tmpA
ORDER BY idvisit, idlink_va;
DROP TEMPORARY TABLE tmpA;
基于临时表,可以访问页面次数:
SELECT l.idvisit, t.time_spent_action, l.*
FROM piwik_log_link_visit_action l
LEFT JOIN tmp t ON (t.idlink_follow = l.idlink_va)
ORDER BY l.idvisit, l.server_time
介意删除临时表。
DROP TEMPORARY TABLE tmp;
关于mysql - Piwik MySQL 数据库 : calculate length of user actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632772/