Fusionner et comparer des BD

Résolu/Fermé
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - 1 août 2022 à 11:18
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - 10 août 2022 à 09:32

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.

12 réponses

jee pee Messages postés 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
1 août 2022 à 12:56

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
1 août 2022 à 15:45

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
1 août 2022 à 16:12

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
1 août 2022 à 16:47

Mettre A à jour en prenant dans B.

KEY correspond à quoi ?

0
jee pee Messages postés 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
1 août 2022 à 16:49

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
1 août 2022 à 17:58

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
1 août 2022 à 18:04

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
1 août 2022 à 18:24

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
1 août 2022 à 18:39

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024
1 août 2022 à 19:05

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230 > t671
Modifié le 1 août 2022 à 19:22

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 août 2022 à 09:50

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 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
8 août 2022 à 17:18

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 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
8 août 2022 à 12:05

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 août 2022 à 13:14

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
8 août 2022 à 15:02

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 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024
9 août 2022 à 07:52

Peut-être 

insert into c
select * from a
union
select * from b
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11 > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
9 août 2022 à 09:30

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 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024
9 août 2022 à 09:54

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11 > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
9 août 2022 à 10:47

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 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
8 août 2022 à 23:24

Ah là je ne pourrai t'aider.


0
jee pee Messages postés 39606 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 avril 2024 9 230
9 août 2022 à 14:34
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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
9 août 2022 à 17:58

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11 > t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024
9 août 2022 à 18:09

C'est bon ! Il me manquait une colonne !

0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
10 août 2022 à 09:32

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 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
9 août 2022 à 16:38

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

Merci !

0