Se você precisar detectar quais registros representam um login sem um registro de logout correspondente e vice-versa, seria útil estender suas tabelas com um ID de sessão exclusivo. Adicione uma coluna
session_id
, gere seu valor no login, lembre-se dele na sessão e coloque o mesmo valor em session_id
para o erro de logout. Isso simplificaria muito as consultas. Se você precisar de uma consulta que adicione registros de login ausentes, tente o seguinte:
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 .) Você pode inserir o resultado na tabela (
INSERT INTO logs (...) SELECT ...
) ou adicione a consulta ao UNION em sua consulta original. Conforme observado por @OlivierCoilland, a consulta está ficando bastante complexa e você pode considerar a análise no lado do aplicativo. Como acho que a tabela de log é bem grande, você não deve confiar que caberá todas as entradas na memória. Você provavelmente precisaria de algum tipo de técnica de "janela deslizante".
A quarta opção é excluir registros de logout não correspondentes. Minha solução precisa de uma tabela temporária, então não colo o código inteiro (muito longo) aqui, apenas veja o violino .