Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 28/09/2008, 00h02   #1
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Par défaut Doublons à fusionner

J'ai 684 doublons (donc 1368 lignes) dans une table que j'aimerais fusionner.

Sans entrer dans le détail de la composition exacte de ma table (issue d'un fichier texte), disons qu'elle est composée des colonnes a, b, c et d.
Soit un doublon représenté par les lignes suivantes :
----a----||----b----||----c----||----d----
---DE---||--id1--||----------||--infod--
---FR---||--id1--||--infoc--||----------

On voit ci-dessus que le doublon est défini par le fait que les deux lignes ont id1 dans la colonne b.
Sachant qu'au final, je ne garderai que la ligne avec FR en colonne a, je souhaiterais récupérer infod de la colonne d pour compléter ma ligne à garder.

S'il n'y avait que quelques doublons, je le ferais à la main. Mais 684 doublons dans une table de 35 millions de lignes, je cherche plutôt un système automatique pour le faire.

En gros le principe c'est :
- si j'ai une ligne de doublon avec FR, je récupère les infos manquantes de ma ligne à garder à partir de la ligne à détruire.
- si j'ai deux lignes FR ou deux lignes pas FR, je garde une ligne en la complétant le plus possible avec les infos de l'autre.

Une idée ?
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2008, 05h08   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
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 531
Points : 3 524
Points : 3 524
Saluton,
La seule chose qui me vienne à l'idée c'est d'extraire les doublons en les agrégeant dans une table temporaire:
Code :
1
2
3
4
5
6
CREATE TEMPORARY doublons AS
SELECT GROUP_CONCAT(lt.a SEPARATOR '|') a, lt.b,
 GROUP_CONCAT(lt.c SEPARATOR '|') c, 
 GROUP_CONCAT(lt.d SEPARATOR '|') d
FROM latable lt
WHERE 2=(SELECT COUNT(lt2.b) FROM latable lt2 WHERE lt2.b=lt.b GROUP BY lt2.b)
Il faut ensuite faire le ménage dans les colonnes a, c et d des 684 lignes de la vue, là va falloir bidouiller, peut-être en langage procédural.
Supprimer les lignes de la vue :
Code :
DELETE FROM latable WHERE b IN (SELECT b FROM doublons ORDER BY b)
puis réinsérer les lignes nettoyées de la vue dans latable
Code :
INSERT INTO latable SELECT * FROM doublons
J'avoue que ce qui m'inquiète beaucoup c'est la sous-requête corrélée sur une table de 35 millions de lignes.
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2008, 10h19   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Le problème, c'est que GROUP CONCAT va garder les deux valeurs d'une colonne lorsque celle-ci est renseignée dans les deux lignes alors que ce que je veux c'est alimenter les colonnes vides de la ligne à garder avec les valeurs de la ligne à détruire. Mais lorsque la ligne à garder a déjà une valeur dans une colonne, je ne veux pas changer cette colonne.

Si ce n'est pas faisable en MySQL, je peux essayer en PHP. Le tableau des lignes en double fait 1368 lignes, ce n'est pas encore énorme.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2008, 10h24   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
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 531
Points : 3 524
Points : 3 524
Saluton,
C'est ce dont je te prévenais par
Citation:
Il faut ensuite faire le ménage dans les colonnes a, c et d des 684 lignes de la vue, là va falloir bidouiller, peut-être en langage procédural.
En php en triturant les GROUP_CONCAT àcoup d'explode, ou avec des regex, ça ne devrait pas être bien compliqué. L'intérêt c'est que tu peux travailler sur les doublons extraits jusqu'à être sur du nettoyage avant de faire l'insertion.
Bon courage.
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 14h00   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Finalement, j'avais très peu de vrais doublons de ce type.
J'ai corrigé à la main.
Merci quand même pour l'idée.
__________________
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 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 06h33.


 
 
 
 
Partenaires

Hébergement Web