Hvis du har brug for at finde ud af, hvilke poster der repræsenterer et login uden en matchende logout-post og omvendt, ville det være nyttigt at udvide dine tabeller med et unikt sessions-id. Tilføj en kolonne session_id
, generer dens værdi ved login, husk den i sessionen og indsæt den samme værdi til session_id
for logout-fejlen. Det ville forenkle forespørgslerne meget.
Hvis du har brug for en forespørgsel, der vil tilføje manglende login-poster, kan du prøve følgende:
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
(Violin
.) Du kan enten indsætte resultatet i tabellen (INSERT INTO logs (...) SELECT ...
) eller tilføj forespørgslen til UNION i din oprindelige forespørgsel.
Som bemærket af @OlivierCoilland bliver forespørgslen ret kompleks, og du kan overveje analyse på applikationssiden. Fordi jeg gætter på, at logtabellen er ret stor, bør du ikke stole på, at du vil passe alle indgange i hukommelsen. Du ville sandsynligvis have brug for en form for "skydevindue"-teknik.
Den fjerde mulighed er at slette uovertrufne logout-poster. Min løsning har brug for en midlertidig tabel, så jeg indsætter ikke hele (temmelig lange) kode her, bare se violin .