Wenn Sie erkennen müssen, welche Datensätze einen Login ohne einen passenden Logout-Datensatz darstellen und umgekehrt, dann wäre es hilfreich, Ihre Tabellen um eine eindeutige Sitzungs-ID zu erweitern. Fügen Sie eine Spalte session_id
hinzu , generieren Sie seinen Wert bei der Anmeldung, merken Sie sich ihn in der Sitzung und setzen Sie den gleichen Wert auf session_id
für den Abmeldefehler. Es würde die Abfragen sehr vereinfachen.
Wenn Sie eine Abfrage benötigen, die fehlende Anmeldedatensätze hinzufügt, versuchen Sie Folgendes:
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
.) Sie können das Ergebnis entweder in die Tabelle einfügen (INSERT INTO logs (...) SELECT ...
) oder fügen Sie die Abfrage der UNION in Ihrer ursprünglichen Abfrage hinzu.
Wie von @OlivierCoilland angemerkt, wird die Abfrage ziemlich komplex und Sie können eine Analyse auf der Anwendungsseite in Erwägung ziehen. Da die Protokolltabelle meiner Meinung nach ziemlich groß ist, sollten Sie sich nicht darauf verlassen, dass alle Einträge in den Speicher passen. Sie würden wahrscheinlich eine Art "Schiebefenster"-Technik benötigen.
Die vierte Option ist das Löschen von nicht übereinstimmenden Logout-Datensätzen. Meine Lösung benötigt eine temporäre Tabelle, daher füge ich hier nicht den gesamten (ziemlich langen) Code ein, sondern sehe nur den Geige .