Il y a quelques jours, lors d’une exigence, j’ai dû nettoyer les enregistrements en double dans mysql, et l’idée à ce moment-là était de l’écrire en traversant le code, puis j’ai trouvé ça trop compliqué, pensant que je devrais pouvoir résoudre le problème avec une instruction SQL. Après avoir vérifié les informations et consulté le patron, j’ai trouvé une déclaration SQL très pratique, et ici je vais partager cette déclaration SQL et ses idées.
Analyse des besoins
S’il y a des enregistrements en double dans la base de données, supprimez et conservez l’un d’eux (que le critère pour déterminer les champs dupliqués soit plusieurs champs)
solution
Lorsque vous rencontrez ce besoin, vous avez probablement une idée dans votre cœur. La chose la plus rapide à laquelle j’ai pensé, c’est que je pourrais résoudre ça avec une instruction SQL, mais j’étais trop superficiel avec les instructions SQL complexes, donc je voulais demander de l’aide au patron.
Trouve quelqu’un pour t’aider
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
J’ai trouvé une instruction SQL :
Cette idée SQL est évidente, il y a les 3 étapes suivantes :
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Interroger les enregistrements dupliqués dans la table comme condition
- SELECT min(rowid) FROM VITAE GROUP BY peopleId, seq HAVING count(*) > 1 La deuxième condition est la plus petite valeur de l’ID dans les enregistrements dupliqués dans la table de requête
- Enfin, selon les deux conditions ci-dessus, supprimez les enregistrements dupliqués restants sauf le plus petit ID dans l’enregistrement dupliqué
Mais malheureusement, il y a une erreur lors de l’exécution de cette requête, ce qui signifie en gros que la table ne peut pas être mise à jour en même temps que la requête.
Code résolu
D’après l’instruction SQL ci-dessus, je pense que vous pourriez atteindre le même objectif en deux étapes via le code :
- Les ensembles de données en double sont retirés en premier
- À partir du jeu de données interrogé, les doublons restants sont supprimés dans une boucle
J’avais une idée, et je l’ai écrite rapidement, mais j’ai été choqué quand je l’ai lancée, et j’en avais vraiment besoin116gauche et droite, puis je veux trouver une instruction SQL que je peux utiliser, coller le code et le résultat en cours :
SQL parfait [déduplication et laisse un]
Enfin, j’ai eu une réponse parfaite dans un groupe technique, regardez cette affirmation SQL :
La déclaration SQL ci-dessus, si vous regardez de près, il n’est pas difficile de comprendre l’idée, et elle est probablement divisée en 3 étapes pour comprendre :
- (SELECT min(id) id, user_id, monétaire, consume_time DE consum_record GROUPE PAR user_id, monétaire, consume_time AYANT compte(*) > 1) t2 Interroger les enregistrements dupliqués pour former une collection (tableau temporaire t2), qui contient l’ID minimum de chaque enregistrement dupliqué
- consum_record.user_id = t2.user_id et consum_record.monetary = t2.monetary et consum_record.consume_time = t2.consume_time champs associés pour les critères en double
- Supprimer les enregistrements dont les identifiants sont supérieurs aux identifiants dans T2 selon les conditions
Quand j’ai vu cette phrase, je me suis dit que c’était trop puissant. Une telle simple instruction sql peut résoudre un problème aussi complexe, et la posture est ascendante~ C’est aussi très rapide à exécuter, l’exécution de la boucle de code d’origine prend environ 116 secondes, mais ici 0,3 secondes suffisent, incroyable~
|