Quero extrair registros duplicados em um banco de dados MySQL. Isso pode ser feito com:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
O que resulta em:
100 MAIN ST 2
Gostaria de puxá-lo para que ele mostre cada linha que é uma duplicata. Algo como:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Alguma idéia de como isso pode ser feito? Estou tentando evitar fazer o primeiro e depois procurar as duplicatas com uma segunda consulta no código.
mysql
duplicates
Chris Bartow
fonte
fonte
fonte
->having(DB::raw('count(*)'), '>', 2)
à consulta. Muito Obrigado!>=2
? Apenas use #HAVING COUNT(*) > 1
Por que não apenas INNER JOIN a tabela consigo?
Um DISTINCT é necessário se o endereço existir mais de duas vezes.
fonte
WHERE a.id > b.id
filtrar apenas as duplicatas mais recentes, para que eu possa fazer uma pesquisaDELETE
diretamente no resultado. Alterne a comparação para listar as duplicatas mais antigas.Tentei a melhor resposta escolhida para esta pergunta, mas isso me confundiu um pouco. Na verdade, eu precisava disso apenas em um único campo da minha mesa. O exemplo a seguir deste link funcionou muito bem para mim:
fonte
Essa é a consulta semelhante que você solicitou e é 200% fácil e de trabalho também. Aproveitar!!!
fonte
Isso não é mais fácil:
?
fonte
Encontre usuários duplicados por endereço de email com esta consulta ...
fonte
podemos encontrar as duplicatas depende de mais de um campo também. Para esses casos, você pode usar o formato abaixo.
fonte
Encontrar endereços duplicados é muito mais complexo do que parece, especialmente se você precisar de precisão. Uma consulta MySQL não é suficiente neste caso ...
Trabalho na SmartyStreets , onde lidamos com validação, desduplicação e outras coisas, e já vi muitos desafios diversos com problemas semelhantes.
Existem vários serviços de terceiros que sinalizam duplicatas em uma lista para você. Fazer isso somente com uma subconsulta do MySQL não levará em consideração diferenças nos formatos e padrões de endereço. O USPS (para endereço nos EUA) possui certas diretrizes para tornar esses padrões, mas apenas alguns fornecedores estão certificados para executar essas operações.
Portanto, eu recomendaria a melhor resposta para você exportar a tabela para um arquivo CSV, por exemplo, e enviá-la para um processador de lista capaz. Uma delas é a Ferramenta de Validação de Endereço em Massa do SmartyStreets, que fará isso em alguns segundos ou em alguns minutos automaticamente. Ele sinalizará linhas duplicadas com um novo campo chamado "Duplicar" e um valor
Y
nele.fonte
Outra solução seria usar aliases de tabela, assim:
Tudo o que você está fazendo realmente, neste caso, está tomando o original lista mesa, criando dois p tabelas retend - p 1 e p 2 - fora disso, e em seguida, executar uma junção na coluna de endereço (linha 3). A quarta linha garante que o mesmo registro não seja exibido várias vezes no seu conjunto de resultados ("duplicatas duplicadas").
fonte
Não será muito eficiente, mas deve funcionar:
fonte
Isso selecionará duplicatas em uma passagem de tabela, sem subconsultas.
Essa consulta emula
ROW_NUMBER()
atualmente presentes emOracle
eSQL Server
Veja o artigo no meu blog para obter detalhes:
MySQL
.fonte
FROM (SELECT ...) aoo
é uma subconsulta :-PIsso também mostrará quantas duplicatas existem e ordenará os resultados sem junções
fonte
fonte
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Para sua mesa, seria algo como
Esta consulta fornecerá todas as entradas de endereço distintas na sua tabela de lista ... Não sei como isso funcionará se você tiver algum valor de chave primária para nome, etc.
fonte
Procedimento de consultas de remoção de duplicatas mais rápido:
fonte
Pessoalmente, esta consulta resolveu meu problema:
O que esse script faz é mostrar todos os IDs de assinantes que existem mais de uma vez na tabela e o número de duplicatas encontradas.
Estas são as colunas da tabela:
Espero que seja útil para você também!
fonte
Substitua cidade pela sua mesa. Substitua nome pelo nome do seu campo
fonte
fonte
fonte
Para ver rapidamente as linhas duplicadas, você pode executar uma única consulta simples
Aqui estou consultando a tabela e listando todas as linhas duplicadas com o mesmo user_id, market_place e sku:
Para excluir a linha duplicada, você deve decidir qual linha deseja excluir. Por exemplo, aquele com ID inferior (geralmente mais antigo) ou talvez alguma outra informação de data. No meu caso, só quero excluir o ID inferior, pois o ID mais recente é a informação mais recente.
Primeiro verifique se os registros corretos serão excluídos. Aqui, estou selecionando o registro entre duplicatas que serão excluídas (por ID único).
Em seguida, executo a consulta de exclusão para excluir os dupes:
Backup, verifique, verifique, verifique o backup e execute.
fonte
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
a subconsulta interna retorna linhas com endereço duplicado e a subconsulta externa retorna a coluna de endereço para o endereço com duplicatas. a subconsulta externa deve retornar apenas uma coluna porque foi usada como operando para o operador '= any'
fonte
A resposta do Powerlord é realmente a melhor e eu recomendaria mais uma alteração: use LIMIT para garantir que o banco de dados não fique sobrecarregado:
É um bom hábito usar LIMIT se não houver ONDE e ao fazer junções. Comece com um valor pequeno, verifique o peso da consulta e aumente o limite.
fonte