Bonjour à tous.
J'espère avant tout que quelqu'un pourra m'aider à résoudre mon problème, ça fait 4 jours que je planche dessus et... je ne vois aucune issue de secours
Je vous préviens, ce post sera long (voire très long)
Je vais d'abord essayer d’énoncer clairement les faits :
J'ai une base (appelons-la BOTIN1) composée de 2 tables (appelons-les annuaire1 et annuaire2).
Structure annuaire1 :
Structure annuaire2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 CREATE TABLE annuaire1 ( id_ann1 int primary key not null auto_increment, col1 varchar (25), col2 varchar (100) not null, col3 varchar (8), col4 varchar (20), col5 varchar (20), mail varchar (70), telephone varchar (17), telephone2 varchar (40), col9 varchar (6), col10 varchar (9), col11 varchar (100), col12 varchar (100), col13 varchar (100), col14 varchar (3), col15 char (45), col16 char (32) );
Remarque : dans cette table, les entrées peuvent être multiples, c'est-à-dire que je peux avoir (si je ne me trompe pas) au maximum deux fois la même personne (avec la même adresse mail donc), mais avec un numéro de téléphone différent (et c'est là que se situe tout mon problème). Cela signifie que ces personnes ont deux numéros de téléphones. Ne me demandez pas pourquoi ces différents numéros de téléphone ne sont pas renseignés sur la même ligne, mais dans la colonne « tel2 », je n’en sais rien, c'est comme ça...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CREATE TABLE annuaire2 ( id_ann2 int primary key not null auto_increment, col1 varchar (255) not null, col2 varchar (50) not null, col3 varchar (50) not null, col4 varchar (100), col5 char (40), col6 varchar (8), mail2 varchar (50), tel1 varchar (12), tel2 varchar (12), tel3 varchar (12) );
Dans la table annuaire1 :
Comme vous pouvez le deviner, j'ai des numéros de téléphone dans le champ "telephone". Mais, il en manque certains. Et SURTOUT, certains numéros sont FAUX (because changements de numéros, etc)
Mon objectif :
- Récupérer les numéros manquants grâce au champ "tel1" de la table "annuaire2"
- CORRIGER les faux numéros (toujours grâce au champ "tel1" de "annuaire2". Voire, grâce au champ "tel2"...)
Pour ce faire, j'ai créé une autre base (appelons-la BOTIN2), avec une autre table. Appelons cette table annuaire_final
Structure annuaire_final :
Au début de mon travail, j'avais involontairement omis la partie "entrées pouvant être multiples". Je ne m'étais occupée que du cas "champs vides », donc je me contentais de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE annuaire_final ( id_ann_fin int primary key not null auto_increment, mail varchar (70), //ladresse mail de botin1.annuaire1 tel1 varchar (17), tel2 varchar (17) tel3 varchar (17) //les trois champs sont issus de botin1.annuaire2 );
Ce qui fonctionne très bien... mais ne répond pas intégralement à ce que je souhaite faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`) SELECT mail, tel1, tel2, tel3 FROM botin1.annuaire1, botin1.annuaire2 WHERE telephone ='' AND tel != '' AND mail = mail2 AND mail != '' ;
En réfléchissant un peu, j'ai essayé de poser les différentes étapes dont j'avais besoin pour faire ce que je veux faire :
Si annuaire1.mail = annuaire2.mail2 (et que mail != '' et que telephone != ''... mais ça complexifie les choses pour le moment)
- Si le champ "annuaire1.telephone" est vide : j'envoie dans annuaire_final.tel (de la base botin2) la valeur qui correspond grâce à la requête que j'ai mise juste au-dessus
- Si le champ "annuaire1.telephone n'est pas vide :
- Comparaison du "annuaire1.telephone" avec "annuaire2.tel1" :
- si les deux valeurs sont égales => ne rien faire
- Si les valeurs ne sont pas égales :
- Comparaison de "annuaire1.telephone" avec "annuaire2.tel2" :
- Si les valeurs sont égales => ne rien faire
- Si les valeurs ne sont pas égales => exécution de la requête du haut
En écrivant tout ça, j'ai peur d'avoir oublié une/des subtilité(s). Ce que je dois éviter, dans tous les cas d'avoir sur une même ligne deux fois le même numéro dans la table botin2.annuaire_final, ce qui est un des risques (puisque plusieurs entrées, blablabla).
C'est là qu'entre en compte les IF et les procédures stockées.
J'ai bien compris qu'on ne pouvait pas faire de IF dans une requête "basique". Donc, hop là, je voulais tout foutre dans une procédure stockée. Alors, bon, j'ai bien vu que les IF et les ELSE, en SQL, n'avaient pas vraiment la même structure que dans les autres langages... mais je me suis lancée tout de même.
J'ai d'abord voulu commencer par quelque chose de simple. J'ai donc essayé ceci :
Mais… ça ne fonctionne pas. Alors, concrètement, je ne sais pas si ce que j’ai écrit (en terme de structure pure des IF/ELSE) est bon ou pas (ce qui, déjà, ne m’aide pas). Il faut dire qu'en cherchant des heures et des heures, je n'ai trouvé AUCUN exemple similaire au mien sur internet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 BEGIN IF annuaire1.mail = annuaire2.mail2 THEN IF annuaire1.telephone = "" THEN INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`) SELECT mail, tel1, tel2, tel3 FROM botin1.annuaire1, botin1.annuaire2 WHERE mail = mail2 AND telephone ='' AND tel1 != '' AND mail != '' ; END IF; END IF; END
Tel quel, quand j’exécute ma procédure, j’ai ce message d’erreur : ‘MySQL a répondu :#1109 – Unknown table ‘annuaire1.mail » in field list’'.
Message que je ne comprends pas trop, puisque ma procédure se trouve dans ma base « botin1 », qu’elle a donc accès aux deux tables qui sont dedans, que je spécifie bien… bref. Clairement, il me manque un truc (ou alors tout est faux, lol)…
Si je modifie mon premier IF en :
J’ai le message suivant : ‘MySQL a répondu : #1054 – Unknown column ‘mail’ in ‘field list ‘’
Code : Sélectionner tout - Visualiser dans une fenêtre à part IF mail = mail2
Alors, si déjà, je bloque avec cette toute petite partie de requête, je n’ose imaginer avec TOUTES les requêtes/conditions que j’aimerais mettre…
Bref, est-ce que quelqu’un a une solution pour moi ?
Je vous en serai reconnaissante à vie !
Merci d’avance à ceux qui prendront le temps de se casser la tête sur mon problème.
Partager