Je veux extraire des enregistrements en double dans une base de données MySQL. Cela peut être fait avec:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Ce qui se traduit par:
100 MAIN ST 2
Je voudrais le retirer pour qu'il affiche chaque ligne en double. Quelque chose comme:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Avez-vous des réflexions sur la façon dont cela peut être fait? J'essaie d'éviter de faire le premier puis de rechercher les doublons avec une deuxième requête dans le code.
mysql
duplicates
Chris Bartow
la source
la source
la source
->having(DB::raw('count(*)'), '>', 2)
à la requête. Merci beaucoup!>=2
? Il suffit d'utiliserHAVING COUNT(*) > 1
Pourquoi ne pas simplement INNER JOIN la table avec elle-même?
Un DISTINCT est nécessaire si l'adresse peut exister plus de deux fois.
la source
WHERE a.id > b.id
filtrer uniquement les doublons les plus récents, de cette façon je peux faire unDELETE
directement sur le résultat. Basculez la comparaison pour répertorier les anciens doublons.J'ai essayé la meilleure réponse choisie pour cette question, mais cela m'a quelque peu dérouté. En fait, j'avais besoin de cela sur un seul champ de ma table. L'exemple suivant de ce lien a très bien fonctionné pour moi:
la source
C'est la requête similaire que vous avez demandée et son fonctionnement à 200% et facile aussi. Prendre plaisir!!!
la source
N'est-ce pas plus simple:
?
la source
Trouvez des utilisateurs en double par adresse e-mail avec cette requête ...
la source
nous pouvons trouver que les doublons dépendent également de plus d'un champ. Pour ces cas, vous pouvez utiliser le format ci-dessous.
la source
La recherche d' adresses en double est beaucoup plus complexe qu'il n'y paraît, surtout si vous avez besoin de précision. Une requête MySQL ne suffit pas dans ce cas ...
Je travaille chez SmartyStreets , où nous traitons la validation et la déduplication et d'autres choses, et j'ai vu beaucoup de défis divers avec des problèmes similaires.
Il existe plusieurs services tiers qui signaleront les doublons dans une liste pour vous. Faire cela uniquement avec une sous-requête MySQL ne tiendra pas compte des différences de formats d'adresses et de normes. L'USPS (pour l'adresse aux États-Unis) a certaines directives pour rendre ces normes, mais seulement une poignée de fournisseurs sont certifiés pour effectuer de telles opérations.
Donc, je recommanderais la meilleure réponse pour vous est d'exporter la table dans un fichier CSV, par exemple, et de la soumettre à un processeur de liste capable. Un tel est SmartyStreets Bulk Address Validation Tool qui le fera pour vous en quelques secondes à quelques minutes automatiquement. Il signalera les lignes en double avec un nouveau champ appelé "Duplicate" et une valeur
Y
dedans.la source
Une autre solution serait d'utiliser des alias de table, comme ceci:
Dans ce cas, tout ce que vous faites vraiment est de prendre la table de liste d' origine , de créer deux tables de rappel p - p 1 et p 2 - à partir de cela, puis d'effectuer une jointure sur la colonne d'adresse (ligne 3). La quatrième ligne garantit que le même enregistrement n'apparaît pas plusieurs fois dans votre ensemble de résultats ("doublons en double").
la source
Ça ne va pas être très efficace, mais ça devrait marcher:
la source
Cela sélectionnera les doublons en une seule passe de table, pas de sous-requêtes.
Cette requête émule réellement
ROW_NUMBER()
présente dansOracle
etSQL Server
Voir l'article dans mon blog pour plus de détails:
MySQL
.la source
FROM (SELECT ...) aoo
c'est une sous-requête :-PCela vous montrera également combien de doublons ont et ordonnera les résultats sans jointures
la source
la source
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;
Pour votre table, ce serait quelque chose comme
Cette requête vous donnera toutes les entrées d'adresses distinctes dans votre table de liste ... Je ne sais pas comment cela fonctionnera si vous avez des valeurs de clé primaire pour le nom, etc.
la source
Procédure de requête de suppression des doublons la plus rapide:
la source
Personnellement, cette requête a résolu mon problème:
Ce que ce script fait montre tous les ID d'abonné qui existent plus d'une fois dans la table et le nombre de doublons trouvés.
Ce sont les colonnes du tableau:
J'espère que cela vous sera utile non plus!
la source
Remplacez la ville par votre table. Remplacez le nom par le nom de votre champ
la source
la source
la source
Pour voir rapidement les lignes en double, vous pouvez exécuter une seule requête simple
Ici, je recherche le tableau et répertorie toutes les lignes en double avec les mêmes user_id, market_place et sku:
Pour supprimer la ligne en double, vous devez décider quelle ligne vous souhaitez supprimer. Par exemple, celui avec un identifiant inférieur (généralement plus ancien) ou peut-être d'autres informations de date. Dans mon cas, je veux simplement supprimer l'ID inférieur car l'ID le plus récent est la dernière information.
Vérifiez d'abord si les bons enregistrements seront supprimés. Ici, je sélectionne l'enregistrement parmi les doublons qui seront supprimés (par identifiant unique).
Ensuite, j'exécute la requête de suppression pour supprimer les dupes:
Sauvegarde, double vérification, vérification, vérification de la sauvegarde puis exécution.
la source
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
la sous-requête interne renvoie des lignes avec une adresse en double, puis la sous-requête externe renvoie la colonne d'adresse pour l'adresse avec des doublons. la sous-requête externe doit renvoyer une seule colonne car elle a été utilisée comme opérande pour l'opérateur '= any'
la source
La réponse de Powerlord est en effet la meilleure et je recommanderais un autre changement: utilisez LIMIT pour vous assurer que db ne serait pas surchargé:
C'est une bonne habitude d'utiliser LIMIT s'il n'y a pas O WH et lors des jointures. Commencez avec une petite valeur, vérifiez le poids de la requête, puis augmentez la limite.
la source