Si vous avez besoin de détecter quels enregistrements représentent une connexion sans enregistrement de déconnexion correspondant et vice versa, il serait utile d'étendre vos tables avec un ID de session unique.Ajoutez une colonne session_id
, génère sa valeur à la connexion, mémorise-la dans la session et met la même valeur dans session_id
pour l'erreur de déconnexion. Cela simplifierait beaucoup les requêtes.
Si vous avez besoin d'une requête qui ajouterait des enregistrements de connexion manquants, essayez ce qui suit :
SELECT 0 AS idLoginnLog, l1.username, ADDTIME(l1.time, '-0:30:0') AS time, 1 AS type
FROM logs AS l1
LEFT JOIN logs AS l2
ON (l1.username=l2.username AND l2.type=1 AND l2.time BETWEEN ADDTIME(l1.time, '-0:30:0') AND l1.time)
WHERE
l1.type=0
AND l2.idLoginLog IS NULL
(Violon
.) Vous pouvez soit insérer le résultat dans la table (INSERT INTO logs (...) SELECT ...
) ou ajoutez la requête à l'UNION dans votre requête d'origine.
Comme l'a noté @OlivierCoilland, la requête devient assez complexe et vous pouvez envisager une analyse côté application. Parce que je suppose que la table de journal est assez grande, vous ne devriez pas compter que vous tiendrez toutes les entrées en mémoire. Vous auriez probablement besoin d'une sorte de technique de "fenêtre coulissante".
La quatrième option consiste à supprimer les enregistrements de déconnexion sans correspondance. Ma solution a besoin d'une table temporaire, donc je ne colle pas tout le code (assez long) ici, il suffit de voir le violon .