Fusionner et comparer des BD

Résolu
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -  
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

J'ai une base MYSQL avec des données qui dates de 4 ou 5. Ce sont des données généalogique.

A la maison, je travaille sous Hérédis14 qui est un logiciel de généalogie. Les éléments sont au format GEDCOM, et à jour par rapport à ma base mysql.

Je peux exporter ma base hérédis en gedcom vers ma base mysql. Mais je vais avoir des doublons !!!

Il faudrait que je puisse comparer ma base mysql avec ma base hérédis gedcom pour supprimer les doublons0.

Comment faire ? Merci.

A voir également:

12 réponses

jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Bonjour,

Chacun pourra procéder à sa façon.

La base Hérédis étant la plus récente, je l'exporterais vers une nouvelle base Mysql vide. Puis avec des requêtes entre les 2 bdd (ancienne et nouvelle) j'insèrerais les données de l'ancienne non présentes dans la nouvelle.

Il y a combien de tables et maitrises-tu les liens entre elles ?


0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Merci jee pee.

J'avais pensez à cette solution, mais je ne maitrise pas trop pour éffectuer des requêtes .....

Ma plus grosse table comprend 11520 enregistrement.

En supposant que j'ai deux bases mysql. La A (ancienne), et la B (nouvelle et plus complète). Quelle requête dois-je faire pour que les enregistrement qui se trouvent sur A et sur B ne soient pas pris en compte ? Peut-être créer une base C qui fait le trie ???

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Que veux tu faire, mettre A à jour en prenant dans B, ou mettre B à jour en prenant dans A ?

Voila le principe d'un insert pour le premier cas

INSERT into bddA.table1 AS A SELECT * FROM bddB.table1 AS B WHERE B.KEY NOT IN (select KEY FROM bddA.table1)
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Mettre A à jour en prenant dans B.

KEY correspond à quoi ?

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

KEY c'est la clé d'un enregistrement, qui est particulière à chaque table individuellement.

Tu n'as pas répondu à combien de tables ?

Et as tu de quoi charger en Mysql ton export GEDCOM, et enfin une fois chargé en Mysql, sont-ce les mêmes tables que ta base A ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

En tout, j'aurais 3 ou 4 tables à fusionner entre elles. L'élément clé qui relie chaque table peut-être le numéro du conjoint (num_cj). En transformant la base hérédis en gedcom puis mysql, les num_cj de rattachement ne sont plus les mêmes. Mais je peux les modifier.

Pour éviter de toucher les tables A et B, on pourrait créer une table C. Soit A fusionnée à B = C 

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

A tu devrais avoir une sauvegarde, B le fichier d'export pareil, tu peux recharger une nouvelle base

on pourrait créer une table C. Soit A fusionnée à B = C 

oui mais cela repousse le problème des doublons, C est imparfaite

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Je n'ai qu'un fichier gedcom complet. Et une base mysql incomplète.

Après la fusion, est-il possible de supprimer les doublons en cherchant les égalités sur nom, prénom, date naissance ?

si deux éléments similaire, on en supprime un !

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Oui il existe des procédures. En voilà une que j'utilisais il y a déjà 30 ans, il faudra l'adapter à Mysql car elle elle pariculière à Oracle avec le pseudo champ ROWID

delete from &&table where
    (&&cle,rowid) in
    (
        (
         select &&cle,rowid from &&table where
         (&&cle) in
            (
             select &&cle from &&table
                group by &&cle having count(*) > 1
            )
        )
        minus
        (
        select &&cle,min(rowid) from &&table
                group by &&cle having count(*) > 1
        )
    )
/

&&table et &&cle étant des variables demandées par oracle*sql lors de l'execution; on peut donc mettre &&table = personne &&cle = nom,prénom,date de naissance (nom colonnes)

0
t671 > jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention  
 

Mouais, je vais esse, mais je ne connais pas oracle.......

Il faudrait écrire en mysql : fusion table A+ B dans table C. Puis suppression des éléments comportant même nom, prénom et date de naissance. Mais je ne suis pas assez calé en php..... ????

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720 > t671
 

Pourquoi PHP ? Il faut faire du sql direct et on revient à insérer tout A dans C et insérer de B seuls ceux non déjà présents dans C :

INSERT into bddC.personne AS C SELECT * FROM bddB.personne AS B 
  WHERE (B.nom, B.prenom, B.dateNais)  NOT IN (select nom, prenom, dateNais FROM bddC.personne)
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Bonjour. J'étais absent quelques temps, mais maintenant je continue mon histoire.

Je veux donc insérer la table B dans A, en évitant les doublons.

J'ai exécuté une requête sur ma base en passant par le phpadmin de Free.

​INSERT into genfamille.individus AS C SELECT * FROM genfamille.dameron AS B
WHERE (B.nom, B.prenom, B.dateNais) NOT IN (select nom, prenom, dateNais FROM genfamille.individus)

​

J'ai comme erreur en retour : 

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 'AS C SELECT * FROM genfamille.dameron AS B WHERE (B.nom, B.prenom, B.dateNais) ' at line 1

0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

il faut peut être ne pas mettre AS C

et bien sur les tables individus et dameron doivent avoir exactement les mêmes champs

0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 

Bonjour,

heredis a un outil pour détecter les doublons https://help.heredis.com/verification-des-doublons/

tu pourrais faire un test sur une copie de ta base pour voir s'il est suffisamment performant.
eric


0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Ce n'est pas sur ma base hérédis que j'ai des doublons.

J'ai une base MYSQL dont j'ai perdu une partie. Je veux copier ma base hérédis sur ma base mysql, en évitant de copier les doublons de hérédis sur mysql.

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

En faite, je cherche à fusionner deux tables mysql (A+B vers C) en vérifiant qu'il n'y ai pas de doublon dans C.

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention  
 

Peut-être 

insert into c
select * from a
union
select * from b
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Bonjour yg_be, et merci de m'aider. J'ai passer la commande 

insert into individus_result select * from individus union select * from dameron

et j'ai eu l'erreur en retour : Duplicate entry '2' for key 1

Pour jee_pee :

j'ai passer la commande :

​INSERT into individus SELECT * FROM dameron
WHERE (nom, prenom, date_naissance FROM dameron) NOT IN (select nom, prenom, date_naissance FROM individus)

et j'ai eu l'erreur : 

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 '​INSERT into individus SELECT * FROM dameron WHERE (nom, prenom, date_naissan' at line 1

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention  
 

La table "individus_result" est bien vide au départ?

Pour moi, "pas de doublon" signifie pas "deux enregistrements totalement identiques".  Je pense quen dans ton cas, cela signifie autre chose.

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Oui, la table "individus_result" est bien vide.

Pas de doublon signifie bien pas deux enregistrement totalement identique. C'est pourquoi je pense faire le filtre sur nom, prénom et date de naissance.

Dans la table individus, on peut donc retrouver la même personne que dans la table dameron. 

0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 

Ah là je ne pourrai t'aider.


0
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
INSERT into individus SELECT * FROM dameron
WHERE (nom, prenom, date_naissance FROM dameron) NOT IN (select nom, prenom, date_naissance FROM individus)

Le FROM dans le WHERE ???

INSERT into individus 
SELECT * FROM dameron AS B
WHERE (B.nom, B.prenom, B.dateNais) NOT IN (select nom, prenom, dateNais FROM individus)

ou avec ()

INSERT into individus 
( SELECT * FROM dameron AS B
WHERE (B.nom, B.prenom, B.dateNais) NOT IN (select nom, prenom, dateNais FROM individus) )

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

En faisant des tests, je remarque des erreurs.

En fait, il faudrait que s'il y a doublon, ce soit la table dameron qui prime. Donc je pense qu'il faut inverser les tables dans le script et écrire :

INSERT into dameron 
SELECT * FROM individus AS B
WHERE (B.nom, B.prenom, B.date_naissance) NOT IN (select nom, prenom, date_naissance FROM dameron)

Mais là j'ai l'erreur : Column count doesn't match value count at row 1

Je n'ai pas changé les colonnes .... Et si ça marche dans un sens, ça peut marcher dans l'autre !?

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11 > t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention  
 

C'est bon ! Il me manquait une colonne !

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

Dans ma requête 

INSERT into dameron 
SELECT * FROM individus AS B
WHERE (B.nom, B.prenom, B.date_naissance) NOT IN (select nom, prenom, date_naissance FROM dameron)

j'ai tous les dameron en double ................

0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 

ca y est jee pee. le premier script fonctionne :o)

Merci !

0