Pokud potřebujete zjistit, které záznamy představují přihlášení bez odpovídajícího odhlašovacího záznamu a naopak, pak by bylo užitečné rozšířit vaše tabulky o jedinečné ID relace. Přidejte sloupec session_id
, vygenerujte jeho hodnotu při přihlášení, zapamatujte si ji v relaci a vložte stejnou hodnotu do session_id
za chybu odhlášení. Hodně by to zjednodušilo dotazy.
Pokud potřebujete dotaz, který by přidal chybějící přihlašovací záznamy, zkuste následující:
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
(Fiddle
.) Výsledek můžete buď vložit do tabulky (INSERT INTO logs (...) SELECT ...
) nebo přidejte dotaz do UNION v původním dotazu.
Jak poznamenal @OlivierCoilland, dotaz se stává poměrně složitým a můžete zvážit analýzu na straně aplikace. Protože si myslím, že tabulka protokolů je dost velká, neměli byste se spoléhat na to, že se vám všechny položky vejdou do paměti. Pravděpodobně byste potřebovali nějakou techniku "posuvného okna".
Čtvrtou možností je smazání neshodných záznamů odhlášení. Moje řešení potřebuje dočasnou tabulku, takže sem nevkládám celý (dost dlouhý) kód, stačí se podívat na housle .