Als u wilt detecteren welke records een login vertegenwoordigen zonder een overeenkomend uitlogrecord en vice versa, dan zou het handig zijn om uw tabellen uit te breiden met een unieke sessie-ID.Voeg een kolom toe session_id
, genereer de waarde ervan bij het inloggen, onthoud het in de sessie en geef dezelfde waarde op session_id
voor de uitlogfout. Het zou de zoekopdrachten veel vereenvoudigen.
Als je een zoekopdracht nodig hebt die ontbrekende inloggegevens zou toevoegen, probeer dan het volgende:
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
.) U kunt het resultaat in de tabel invoegen (INSERT INTO logs (...) SELECT ...
) of voeg de zoekopdracht toe aan de UNION in uw oorspronkelijke zoekopdracht.
Zoals opgemerkt door @OlivierCoilland, wordt de vraag behoorlijk complex en kun je analyse aan de kant van de applicatie overwegen. Omdat ik denk dat de logtabel behoorlijk groot is, moet je er niet op vertrouwen dat je alle gegevens in het geheugen kunt plaatsen. Je hebt waarschijnlijk een soort van "schuifraam"-techniek nodig.
De vierde optie is het verwijderen van ongeëvenaarde uitlogrecords. Mijn oplossing heeft een tijdelijke tabel nodig, dus ik plak hier niet de hele (behoorlijk lange) code, kijk gewoon naar de viool .