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.
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Plutôt marrant, nous avons eu deux interprétations de ton exposé de problème qui débouchent, chacune, sur une solution adaptée.
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
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 !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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 )
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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![]()
Partager