2015-09-17 13 views
1

Я пытаюсь вычислить длину действия пользователя на веб-сайте, который был отслежен Piwik. Данные сеанса хранятся в таблице MySQL «log_visit_action».Piwik MySQL DB: рассчитать длину действий пользователя

В колонке «time_spent_action» я хочу рассчитать время, потраченное пользователем, до принятия следующего действия или до выхода из веб-сайта (никаких дальнейших действий, связанных с «idvisit»).

В Excel я бы знал, как решить проблему. По сути, это не сложно. Но поскольку я новичок в MySQL, я понятия не имею, как реализовать его в этой таблице MySQL с 50 миллионами записей. Возможно, вы можете привести примеры кода?

Это скриншот структуры таблицы, которую я экспортировал в Excel. Здесь вы можете найти примеры данных на sqlfiddle.

Большое спасибо заранее, Lars

Table Structure

+0

Поместите стол на http://www.sqlfiddle.com с некоторыми, например, данные –

+0

Вот некоторые примеры данных: http://www.sqlfiddle.com/#!9/62f235/3 – LarsVegas

+0

Здравствуйте Раймонд, как вы думаете, у вас есть решение? – LarsVegas

ответ

1

Я подошел с той же проблемой, в последнее время. Поэтому, вот решение, работающее с временными таблицами. На самом деле, я предлагаю два решения.

Решение (А) идентифицирует последующую 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. Для таблицы с 12 миллионами записей первый шаг занял около 3,5 часов. – LarsVegas