Jeśli chcesz wykryć, które rekordy reprezentują logowanie bez pasującego rekordu wylogowania i odwrotnie, warto rozszerzyć tabele o unikalny identyfikator sesji. Dodaj kolumnę session_id
, wygeneruj jego wartość przy logowaniu, zapamiętaj ją w sesji i umieść tę samą wartość w session_id
dla błędu wylogowania. To znacznie uprościłoby zapytania.
Jeśli potrzebujesz zapytania, które doda brakujące rekordy logowania, spróbuj wykonać następujące czynności:
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
(Skrzypce
.) Możesz wstawić wynik do tabeli (INSERT INTO logs (...) SELECT ...
) lub dodaj zapytanie do UNION w pierwotnym zapytaniu.
Jak zauważył @OlivierCoilland, zapytanie staje się dość złożone i można rozważyć analizę po stronie aplikacji. Ponieważ myślę, że tablica dziennika jest dość duża, nie powinieneś polegać na tym, że zmieścisz wszystkie wpisy w pamięci. Prawdopodobnie potrzebujesz techniki „przesuwanego okna”.
Czwartą opcją jest usuwanie niezgodnych rekordów wylogowania. Moje rozwiązanie potrzebuje tymczasowej tabeli, więc nie wklejam tutaj całego (dość długiego) kodu, wystarczy zobaczyć skrzypce .