Comment comparé une ligne avec une ligne précédente en MySQL [Résolu]

- - Dernière réponse :  NotTheFood - 23 avril 2019 à 14:52
Bonjour à tous,

Ma question concerne une base de donnée de la quelle je doit extraire le nombre d'actions, d'un utilisateur, séparée de plus de 20 secondes.

Je m'explique, j'ai à ma disposition une table contenant la trace des actions réalisées par les utilisateurs (id_trace, id_user, action_time pour simplifier) avec action_time la date et l'heure de l'action.
Je dois donc compter le nombre d'action d'un utilisateur séparée de au moins 20 sec.

Mon avancement n'est pas brillant, j'ai simplement réussi à obtenir une table contenant l'heure d'une action et l'heure d'une action précédente mais qui n'est pas nécessairement une action lié au bon utilisateur.

Ma question est donc la suivante comment puis-je obtenir l'heure de l'action précédente d'un user en particulier ?

En vous remerciant,
Afficher la suite 

3 réponses

Messages postés
8548
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2019
424
0
Merci
bonjour, pourquoi cherches-tu l'action précédente?
moi je ferais, pour commencer:
select t1.id_trace, t1.id_user, t1.action_time, t2.id_trace, t2.action_time
from trace as t1, trace as t2
where
t1.id_user = t2.id_user
and t2.action_time - t1.action_time > 20/24/3600
Bonjour,

Merci pour ta réponse mais je ne saisi pas bien ce que représente le résultat de la jointure sur id_user.
Commenter la réponse de yg_be
Messages postés
8548
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2019
424
0
Merci
bonjour, si un utilisateur fait une action à un moment, une autre 15 secondes plus tard, et une troisième encore 15 secondes plus tard, cela compte pour combien?
Théoriquement deux mais c'est effectivement un aspect auquel je n'ai pas réfléchi.
Commenter la réponse de yg_be
0
Merci
Rebonjour,

Voici comment j'ai finalement résolu mon problème :

SET @tranche=1;
CREATE TABLE tmpt (
id INT PRIMARY KEY AUTO_INCREMENT,
id_user INT,
action_time DATETIME
)

INSERT INTO tmpt(id_user, action_time) (
SELECT id_user, action_time
FROM trace
GROUP BY id_user, action_time
);

SELECT id_user, count(distinct tranche) as nb_tranche
FROM (SELECT t1.id_user, @tranche:= IF( t1.id_user = t2.id_user AND t1.action_time < t2.action_time -20, @tranche, @tranche +1) as tranche FROM tmpt t1 JOIN tmpt t2 ON t1.id=t2.id-1) as TMP
GROUP BY id_user;

En vous remerciant pour vos réponses :)
Commenter la réponse de NotTheFood