O banco de dados é MariaDB 10.3.25
Eu tenho 2 colunas que são relevantes:
UserID e LastUpdate
UserID consiste em usuário@domínio LastUpdate é um campo de data.
Aqui está o meu problema - eu tenho a consulta atual:
select a.UserID,
substring_index(a.UserID, '@', -1),
max(a.lastupdate)
from MyTable a
group by a.UserID
having max(a.lastupdate) < '2020-03-31'
Isso mostra todos os usuários que não atualizaram em pouco mais de um ano e o domínio. No entanto, há o seguinte cenário que eu quero considerar:
UserID LastUpdate
[email protected] 2020-08-16
[email protected] 2019-05-16
[email protected] 2021-05-05
Com a consulta atual, [email protected] será capturado e, portanto, o domínio A.com será capturado como não em uso, mas o usuário [email protected] ainda está ativo - quero fazer um Max(a.lastupdate ), mas agrupe-o, substring_index(a.UserID, '@', -1)
mas também cuspa todos os usuários desse domínio. Tenho certeza que a resposta está me encarando...
Veja se é o que você quer
A melhor maneira de fazer isso é provavelmente a seguinte. Esta solução faz uso da
GENERATED COLUMN
funcionalidade do MariaDB >= 10.3 (também no MySQL >= 5.7) - é realmente muito útil para consultas como esta - também torna a consulta muito mais legível.Todo o código abaixo está disponível no violino aqui :
E então alguns registros de amostra:
E então execute a consulta:
Resultado:
Isso funciona em todas as versões do MariaDB >= 10.3 do dbfiddle.uk (um ótimo recurso) e também nas versões do MySQL >= 5.7.
Também funciona quando o ONLY_FULL_GROUP_BY do MySQL está definido! Isso é muito importante - se essa variável não estiver definida, as consultas podem (e vão - também ver aqui e aqui ) retornar resultados errôneos (veja meu comentário para a outra resposta a esta pergunta aqui ).
Por exemplo, basta olhar para a parte inferior do violino, onde apontei o problema que surgiu com a outra resposta neste caso (relativamente simples ) - em uma declaração complexa, esse problema pode levar a todos os tipos de problemas difíceis de encontrar bugs - caveat emptor!
EDIT: Depois de ver os comentários sobre a pergunta ( violino ):
Resultado:
(A pergunta principal é tratada por subconsultas, como visto em outras respostas. Aqui estão algumas questões secundárias.)
ajudará o desempenho.
E por que não fazer
Para que você não precise ficar alterando a consulta.