Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

inserir ou omitir entradas na consulta mysql com base nas condições dos resultados


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 .