Bonjour,
J'ai une table sql avec plusieurs champs. J'aimerai tester si des doublons existent sur deux de ces colonnes dans ma table pour pouvoir les supprimer.
Comment faire?
Merci d'avance!
Bonjour,
J'ai une table sql avec plusieurs champs. J'aimerai tester si des doublons existent sur deux de ces colonnes dans ma table pour pouvoir les supprimer.
Comment faire?
Merci d'avance!
Bonjour,
tu peux faire ceci :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM taTable GROUP BY champ1, champ2 HAVING COUNT(*) > 1
Saluton,
Tu fais deux SELECT sur la même table chacun sur une des deux colonnes que tu renommes (AS) de manière identique dans les deux SELECT.
Tu mets ces SELECTs en UNION ALL tu comptes dans un GROUP BY et tu ne retiens avec une clause HAVING que les items dont le comptage est supérieur à 1.
Tu vas comme cela détecté les doublons (voire triplets ou plus) aussi bien entre les deux colonnes que dans chacune des colonnes.
Plutôt marrant, nous avons eu deux interprétations de ton exposé de problème qui débouchent, chacune, sur une solution adaptée.
Voilà ce que j'ai fait:
J'ai crée une nouvelle colonne dans laquelle j'ai concaténé mes 2 champs.
J'utilise donc cette colonne pour trouver les doublons:
Maintenant comment faire pour les supprimer?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT doublon FROM cv WHERE `upddt` >= '2010-11-19' and upddt <= '2010-11-23' GROUP BY doublon HAVING COUNT(doublon) > 1 ORDER BY `upddt` DESC
Voilà ce que je fais mais j'ai une erreur:
Erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Delete From cv c1 where c1.doublon in (SELECT c2.doublon FROM cv c2 WHERE c2.`upddt` >= '2010-11-19' and c2.upddt <= '2010-11-23 10:27:01' GROUP BY c2.doublon HAVING COUNT(c2.doublon) > 1 ORDER BY `c2`.`upddt` DESC)
Code : Sélectionner tout - Visualiser dans une fenêtre à part #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c1 where c1.doublon in (SELECT c2.doublon FROM cv c2 WHERE c2.`upddt` >= '201' at line 1
de mémoire je crois que la syntaxe avec des alias est celle ci :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DELETE alias FROM table AS alias WHERE...
Sinon attention à ton order, il s'effectuera APRES ton group by donc si tu souhaites récupérer toutes les dates décroissantes, c'est raté. J'ai l'habitude de faire même s'il y a surement mieux quelque chose du style :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT C1, C2 FROM ( SELECT C1, C2 FROM table ORDER BY C2 DESC ) GROUP BY C2
bon apparemment la requête delete n'accepte pas d'alias.
Elle en accepte avec la syntaxe que je t'ai donné. Quel est le message d'erreur ?
Voici la requête:
et l'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 DELETE c1 FROM cv AS c1 WHERE c1.doublon in (SELECT c2.doublon FROM cv c2 WHERE c2.`upddt` >= '2010-11-19' and c2.upddt <= '2010-11-23 10:27:01' GROUP BY c2.doublon HAVING COUNT(c2.doublon) > 1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part #1093 - You can't specify target table 'c1' for update in FROM clause
Dites avec cette requête, je ne sélectionne que les doublons?
Si je les sélectionne et que je les supprime sous phpMyAdmin, il ne me supprimera que les doublons??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT c2.doublon FROM cv c2 WHERE c2.`upddt` >= '2010-11-19' AND c2.upddt <= '2010-11-23 10:27:01' GROUP BY c2.doublon HAVING COUNT(c2.doublon) > 1
Est qu'un alter ignore add unique ne fonctionnerait pas dans mon cas?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ALTER IGNORE TABLE cv ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);
Un tutoriel sur l'éradication des doublons devrait faire ton affaire
Merci pour l'exemple et pour la doc!
Voilà ce que je fais:
Mais j'ai le message d'erreur suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 DELETE FROM cv T WHERE T.cv_id < ANY (SELECT cv_id FROM cv T2 WHERE T.cv_id <> T2.cv_id AND T.candidat_id = T2.candidat_id AND T.intitule_poste = T2.intitule_poste AND T.ville = T2.ville AND T.cp = T2.cp AND T.email = T2.email)
Impossible de supprimer!
Code : Sélectionner tout - Visualiser dans une fenêtre à part #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'T WHERE T.cv_id < ANY (SELECT cv_id FROM cv T2 ' at line 2
![]()
MySQL ne respecte une fois de plus pas la norme et ne connais pas ANY.
Après quelques minutes de recherche dans le forum MySQL, la solution s'y trouve !
Malheureusement CinePhil, ça ne fonctionne toujours pas chez moi avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DELETE FROM cv T WHERE T.cv_id < ( SELECT MIN( T2.cv_id ) FROM cv T2 WHERE T.cv_id <> T2.cv_id AND T.candidat_id = T2.candidat_id AND T.intitule_poste = T2.intitule_poste AND T.ville = T2.ville AND T.cp = T2.cp AND T.email = T2.email )Je vais finalement me rabattre sur la requête suivante qui semble bien me supprimer les doublons:MySQL a réponduocumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'T
WHERE T.cv_id < ( SELECT MIN(T2.cv_id)
FROM cv T2
' at line 2
Encore merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part ALTER IGNORE TABLE TabTest ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);
On a dit plus haut que l'utilisation d'alias dans un DELETE était à employer de la sorte :
Donc essaie cette syntaxe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DELETE alias FROM la_table alias...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 DELETE T FROM cv T WHERE T.cv_id < ( SELECT MIN( T2.cv_id ) FROM cv T2 WHERE T.cv_id <> T2.cv_id AND T.candidat_id = T2.candidat_id AND T.intitule_poste = T2.intitule_poste AND T.ville = T2.ville AND T.cp = T2.cp AND T.email = T2.email )
Comme envoyé et dit par mp...
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DELETE ALIAS FROM uneTable AS ALIAS WHERE...
Erreur
requête SQL: Documentation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DELETE T FROM cv T WHERE T.cv_id < ( SELECT MIN( T2.cv_id ) FROM cv T2 WHERE T.cv_id <> T2.cv_id AND T.candidat_id = T2.candidat_id AND T.intitule_poste = T2.intitule_poste AND T.ville = T2.ville AND T.cp = T2.cp AND T.email = T2.email )Rien à faire, il en veut pas mon SQLMySQL a réponduocumentation
#1093 - You can't specify target table 'T' for update in FROM clause![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager