Om du behöver upptäcka vilka poster som representerar en inloggning utan en matchande utloggningspost och vice versa, skulle det vara bra att utöka dina tabeller med ett unikt sessions-ID. Lägg till en kolumn session_id
, generera dess värde vid inloggning, kom ihåg det i sessionen och sätt samma värde till session_id
för utloggningsfelet. Det skulle förenkla frågorna mycket.
Om du behöver en fråga som skulle lägga till saknade inloggningsposter, prova följande:
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
(Fiol
.) Du kan antingen infoga resultatet i tabellen (INSERT INTO logs (...) SELECT ...
) eller lägg till frågan i UNION i din ursprungliga fråga.
Som noterat av @OlivierCoilland blir frågan ganska komplex och du kan överväga analys på applikationssidan. Eftersom jag antar att loggtabellen är ganska stor, bör du inte lita på att du får plats med alla poster i minnet. Du skulle förmodligen behöva någon form av "skjutfönster"-teknik.
Det fjärde alternativet är att ta bort omatchade utloggningsposter. Min lösning behöver en tillfällig tabell, så jag klistrar inte in hela (ganska långa) koden här, se bara fiol .