Se è necessario rilevare quali record rappresentano un accesso senza un record di logout corrispondente e viceversa, sarebbe utile estendere le tabelle con un ID sessione univoco.Aggiungi una colonna session_id
, genera il suo valore all'accesso, ricordalo nella sessione e metti lo stesso valore in session_id
per l'errore di logout. Semplificherebbe molto le query.
Se hai bisogno di una query che aggiunga record di accesso mancanti, prova quanto segue:
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
(Violino
.) Puoi inserire il risultato nella tabella (INSERT INTO logs (...) SELECT ...
) o aggiungere la query a UNION nella query originale.
Come notato da @OlivierCoilland, la query sta diventando piuttosto complessa e puoi considerare l'analisi dal lato dell'applicazione. Poiché immagino che la tabella di registro sia piuttosto grande, non dovresti fare affidamento sul fatto che rientrerai in tutte le voci in memoria. Probabilmente avresti bisogno di una sorta di tecnica di "finestra scorrevole".
La quarta opzione consiste nell'eliminare i record di disconnessione non corrispondenti. La mia soluzione ha bisogno di una tabella temporanea, quindi non incollo l'intero codice (piuttosto lungo) qui, basta vedere violino .