Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/11/2010, 12h20   #1
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Par défaut doublons sur plusieurs colonnes

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!
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h28   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

tu peux faire ceci :

Code sql :
1
2
3
4
 
SELECT * FROM taTable 
GROUP BY champ1, champ2
HAVING COUNT(*) > 1
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h29   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h31   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h38   #5
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
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:

Code :
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
Maintenant comment faire pour les supprimer?
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h49   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
un delete avec id IN(...) ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h58   #7
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Voilà ce que je fais mais j'ai une erreur:

Code :
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)
Erreur:

Code :
#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
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 15h02   #8
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
de mémoire je crois que la syntaxe avec des alias est celle ci :

Code sql :
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 :
1
2
3
4
5
6
 
SELECT C1, C2 FROM (
   SELECT C1, C2 FROM TABLE
   ORDER BY C2 DESC
   )
GROUP BY C2
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 15h18   #9
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
bon apparemment la requête delete n'accepte pas d'alias.
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 15h22   #10
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Elle en accepte avec la syntaxe que je t'ai donné. Quel est le message d'erreur ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 15h26   #11
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Voici la requête:

Code :
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)
et l'erreur:

Code :
#1093 - You can't specify target table 'c1' for update in FROM clause
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 16h54   #12
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Dites avec cette requête, je ne sélectionne que les doublons?
Code :
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
Si je les sélectionne et que je les supprime sous phpMyAdmin, il ne me supprimera que les doublons??
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 10h25   #13
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Est qu'un alter ignore add unique ne fonctionnerait pas dans mon cas?

Code :
ALTER IGNORE TABLE  cv ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h02   #14
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Un tutoriel sur l'éradication des doublons devrait faire ton affaire
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 15h36   #15
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Merci pour l'exemple et pour la doc!

Voilà ce que je fais:
Code :
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)
Mais j'ai le message d'erreur suivant:

Code :
#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
Impossible de supprimer!
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h35   #16
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 945
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 945
Points : 18 140
Points : 18 140
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h58   #17
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Malheureusement CinePhil, ça ne fonctionne toujours pas chez moi avec:
Code :
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 )
Citation:
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
Je vais finalement me rabattre sur la requête suivante qui semble bien me supprimer les doublons:

Code :
ALTER IGNORE TABLE  TabTest ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);
Encore merci!
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h06   #18
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 945
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 945
Points : 18 140
Points : 18 140
Envoyer un message via MSN à CinePhil
On a dit plus haut que l'utilisation d'alias dans un DELETE était à employer de la sorte :
Code :
1
2
DELETE alias 
FROM la_table alias...
Donc essaie cette syntaxe :
Code :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h09   #19
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Comme envoyé et dit par mp...

Code sql :
1
2
 
DELETE ALIAS FROM uneTable AS ALIAS WHERE...
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h09   #20
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Erreur

requête SQL: Documentation

Code :
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 )
Citation:
MySQL a réponduocumentation
#1093 - You can't specify target table 'T' for update in FROM clause
Rien à faire, il en veut pas mon SQL
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h25.


 
 
 
 
Partenaires

Hébergement Web