Alguns dias atrás, quando eu estava fazendo um requisito, precisei limpar os registros duplicados no mysql, e a ideia na época era escrever através de code traversal, e então achei complicado demais, achando que deveria conseguir resolver o problema com uma instrução sql. Depois de checar as informações e consultar o chefe, criei uma declaração SQL muito conveniente, e aqui vou compartilhar essa declaração e ideias SQL.
Análise de necessidades
Se houver registros duplicados no banco de dados, exclua e mantenha um deles (seja o critério para determinar campos duplicados de múltiplos campos)
solução
Quando você encontra essa necessidade, provavelmente tem uma ideia no coração. A coisa mais rápida que pensei foi que eu poderia resolver com uma instrução SQL, mas eu era muito superficial em instruções SQL complexas, então quis pedir ajuda ao chefe.
Encontre alguém para ajudar
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
Encontrei uma instrução SQL:
Essa ideia do SQL é óbvia, existem os seguintes 3 passos:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Consultar registros duplicados na tabela como condição
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 A segunda condição é o menor valor do ID nos registros duplicados na tabela de consulta
- Por fim, de acordo com as duas condições acima, exclua os registros duplicados restantes, exceto o menor ID no registro duplicado
Mas, infelizmente, há um erro ao executar essa instrução, o que significa aproximadamente que a tabela não pode ser atualizada ao mesmo tempo que a consulta.
Código resolvido
Com base na declaração SQL acima, acho que você pode conseguir alcançar o mesmo objetivo em dois passos através do código:
- Conjuntos de dados duplicados são retirados primeiro
- Com base no conjunto de dados consultado, as duplicatas restantes são removidas em um loop
Tive uma ideia, e escrevi rápido, mas fiquei chocado quando a executei, e realmente precisava dela116sesquerda e direita, e então quero encontrar uma instrução SQL que eu possa usar, colar o código e o resultado em execução:
SQL perfeito [deduplicação e deixe um]
Finalmente, recebi uma resposta perfeita em um grupo técnico, veja esta declaração SQL:
A afirmação SQL acima, se você olhar de perto, não é difícil entender a ideia, e provavelmente está dividida em 3 etapas para entender:
- (SELECIONE min(id) id, user_id, monetário, consume_time DE consum_record GRUPO POR user_id, monetário consume_time TENDO contagem(*) > 1) t2 Consulte os registros duplicados para formar uma coleção (tabela temporária t2), que contém o ID mínimo de cada registro duplicado
- consum_record.user_id = t2.user_id e consum_record.monetary = t2.monetary e consum_record.consume_time = t2.consume_time campos Associate para os critérios duplicados
- Exclua registros com IDs maiores que IDs em T2 de acordo com as condições
Quando vi essa frase, pensei comigo mesmo que aquilo era poderoso demais. Uma declaração SQL tão simples pode resolver um problema tão complexo, e a postura está subindo~ Também é super rápido de rodar, a execução do loop original leva cerca de 116s, mas aqui 0,3s é suficiente, incrível~
|