Piwik MySQL DB:计算用户操作的长度
Piwik MySQL DB: calculate length of user actions
我正在尝试计算 Piwik 跟踪的网站上用户操作的时长。会话数据存储在 MySQL table 'log_visit_action'.
在 'time_spent_action' 列中,我想计算用户在执行下一步操作或离开网站之前花费的时间(没有为 'idvisit' 分配进一步的操作)。
在Excel我就知道怎么解决这个问题了。本身并不难。但是由于我是 MySQL 的新手,所以我不知道如何在具有 5000 万个条目的 MySQL table 上实现它。也许您可以提供一些代码示例?
这是我导出到 Excel 的 table 结构的屏幕截图。
在这里您可以找到关于 sqlfiddle.
的一些示例数据
非常感谢,
拉斯
我最近遇到了同样的问题。因此,这里有一个解决方案,使用临时 tables。其实,我提供两种解决方案。
解决方案(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
table。通常是这种情况,但您永远无法完全确定。
# 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;
基于临时table,可访问页面次数:
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
介意删除临时的table。
DROP TEMPORARY TABLE tmp;
我正在尝试计算 Piwik 跟踪的网站上用户操作的时长。会话数据存储在 MySQL table 'log_visit_action'.
在 'time_spent_action' 列中,我想计算用户在执行下一步操作或离开网站之前花费的时间(没有为 'idvisit' 分配进一步的操作)。
在Excel我就知道怎么解决这个问题了。本身并不难。但是由于我是 MySQL 的新手,所以我不知道如何在具有 5000 万个条目的 MySQL table 上实现它。也许您可以提供一些代码示例?
这是我导出到 Excel 的 table 结构的屏幕截图。 在这里您可以找到关于 sqlfiddle.
的一些示例数据非常感谢, 拉斯
我最近遇到了同样的问题。因此,这里有一个解决方案,使用临时 tables。其实,我提供两种解决方案。
解决方案(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
table。通常是这种情况,但您永远无法完全确定。
# 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;
基于临时table,可访问页面次数:
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
介意删除临时的table。
DROP TEMPORARY TABLE tmp;