2015-09-17 25 views
1

我試圖計算Piwik跟蹤的網站上用戶操作的長度。會話數據存儲在MySQL表'log_visit_action'中。Piwik MySQL DB:計算用戶操作的長度

在'time_spent_action'這一列中,我想計算用戶花費的時間,直到下一個動作或直到離開網站(沒有進一步的行爲分配給'idvisit')。

在Excel中,我會知道如何解決這個問題。本身並不困難。但由於我是MySQL的新手,我不知道如何在這個擁有5000萬條目的MySQL表上實現它。也許你可以提供一些代碼示例?

這是我導出到Excel的表結構的屏幕截圖。 在這裏你可以找到sqlfiddle的一些示例數據。

提前許多感謝, 拉爾斯

Table Structure

+0

放在http://www.sqlfiddle.com的表與一些示例數據 –

+0

下面是一些示例數據: http://www.sqlfiddle.com/#!9/62f235/3 – LarsVegas

+0

你好雷蒙德,你認爲你有解決方案嗎? – LarsVegas

回答

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; 
+1

非常感謝!這對我來說確實如此。做得好!我選擇瞭解決方案A.對於有1200萬條記錄的表格,第一步需要約3.5小時。 – LarsVegas