我试图计算Piwik跟踪的网站上用户操作的长度。会话数据存储在MySQL表' log_visit_action'。
中在列' time_spent_action'我想计算用户花费的时间,直到采取下一步行动或离开网站为止(没有进一步的行动分配到' idvisit')。
在Excel中我会知道如何解决问题。这本身并不困难。但由于我是MySQL的新手,我不知道如何在这个拥有5000万条目的MySQL表上实现它。也许你可以提供一些代码示例?
这是我导出到Excel的表格结构的屏幕截图。 您可以在此处找到sqlfiddle上的一些示例数据。
非常感谢, 拉斯
答案 0 :(得分:1)
我最近遇到了同样的问题。因此,这是一个使用临时表的解决方案。实际上,我提供了两种解决方案。
解决方案(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;