Chercher occurrences sur plusieurs tables par la jointure

Résolu
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011 - 2 mai 2011 à 12:13
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011 - 4 mai 2011 à 15:55
Bonjour, je suis nouvelle.

Ceci est mon premier post et j'espère que vous pourrez m'aider.

Je cherche une syntaxe pour retrouver un mot clef sur plusieurs tables mais que cela se fasse entre un champ et un autre. Je m'explique :

Grosso modo j'ai mon occurrence dans la table 3 (disons "toto") et si je trouve ce mot clef dans les champs des tables 1 et 2 j'affiche l'enregistrement de la table 3, je ne sais pas si c'est clair et faisable.

J'ai fait pour le moment ceci, en vain :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'";

Merci par avance de votre aide.

HK aka F69

11 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
3 mai 2011 à 17:07
Salut,

quel SGBD utilises-tu ?
J'ai tenté une telle requête (avec les familles de ROME (ex.: 'A') et les codes ROME (ex. : 'A1101')) sous MySQL et ça fonctionne. Voilà à quoi elle ressemble :
SELECT *
  FROM ref_rome_familles F
  INNER JOIN ref_rome_metiers M
  ON M.code LIKE CONCAT(F.code,'%');


Par contre j'ai pas compris ton histoire de matching A->A, A->B [..]
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2011 à 15:37
En gros tu veux mixer tes deux demandes ?

Essayons trouver un exemple -à peu près- sensé, soit les 3 tables suivantes :
-- table d'acteurs
tbActors {int id, varchar name}
-- table de films
tbMovies {int id, varchar title, varchar actorsList }
-- table de séries TV
tbSeries {int id, varchar title, varchar actorsList }


On considère que les champs actorsList contiennent la liste des noms d'acteurs, séparés par des points-virgules, ayant joués dans le film/série.

On veut maintenant chercher les acteurs ayant joué dans un film :
SELECT A.name
  FROM tbActors A
  INNER JOIN tbMovies M
  ON M.actorsList LIKE CONCAT('%', A.name, '%');

De la même manière, on récupère les acteurs ayant joué dans une série :
SELECT A.name
  FROM tbActors A
  INNER JOIN tbSeries S
  ON S.actorsList LIKE CONCAT('%', A.name, '%');


Pour obtenir la liste des acteurs ayant joué dans un film OU une série, il suffit de UNIONner ces 2 requêtes. Avec un UNION ALL les acteurs apparaîtront autant de fois qu'ils ont joué dans des films/séries. Avec un UNION les acteurs n'apparaîtront qu'une fois s'il ont joué dans 1 à n films et/ou 1 à n séries.
3
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
3 mai 2011 à 16:32
Bonjour,

J'ai essayé ceci :


SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE CONCAT('%', t2.champ2, '%')


Pas mieux...Il faut des valeurs exactes pour que ca marche les jointures ? Ca serait étonnant. LIKE CONCAT fonctionne qu'avec des mots clefs ?

On peut pas matcher de la sorte ?

A -> A
A -> B
A -> C
B -> A
B -> B
...

?

Par avance merci de votre aide.
0
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 09:57
Bonjour et surtout un grand MERCI !!!!

Moi je faisais l'inverse

Si je reprends ta requête, je faisais :

SELECT *
  FROM ref_rome_familles F
  INNER JOIN ref_rome_metiers M
  ON F.code LIKE CONCAT('%',M.code,'%');


Je maitrise mal les jointures et n'avais pas compris le sens du ON. Juste à intervertir

Well done et encore MERCI à toi
0

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

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2011 à 09:59
Je t'avouerai que la première fois que j'ai tapé la requête dans Toad je l'ai également écrite à l'envers ^^
0
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 11:20
re bonjour,

Dernière question (si tu veux bien) : quelle est la bonne syntaxe pour la jointure pour dire trouve moi ça dans la table 1 OU dans la table 2.

Exemple trouver M.Code dans ref_rome_familles.code et la table disons : ref_rome_travailleurs T.

J'ai vu qu'on pouvait faire une succession d'INNER mais que ca sous-entend qu'on retrouve dans chaque table hors moi je cherche à trouver la correspondance dans l'une ou l'autre.

Tu sais ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2011 à 11:33
Il faut que tes 2 tables aient la même structure, ou que les listes des champs sélectionnés correspondent. Exemple, soit 2 tables :
tb1 { int id, varchar name, varchar code, varchar description }
tb2 { int id, varchar name, varchar code, int value }

Le principe est de faire la requête sur chaque table, et de sommer les résultats grace à "UNION/UNION ALL". Reprenons l'exemple. On cherche les enregistrements de tb1 & tb2 où code = 'ABC123' :
SELECT id, name, code FROM tb1 WHERE code = 'ABC123'
UNION ALL
SELECT id, name, code FROM tb2 WHERE code = 'ABC123';


Tu noteras que je ne fais pas un "SELECT *", car le dernier champ n'est pas du même type dans les deux tables, le rassemblement ne serait donc pas possible.

NB : la différence entre UNION et UNION ALL :
UNION ALL : fait le rassemblement brut des 2 requêtes
UNION : applique un "DISTINCT" lors du rassemblement
Dans notre exemple, si tb1 et tb2 contiennent un même enregistrement (identique sur tous les champs de la sélection s'entend, donc même id, même name et même code) alors il ne ressortira qu'une fois.
0
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 13:56
RE re re re re,

Merci pour ce cours particulier ^^

Dans mon cas je recherche 'toto' dans plusieurs tables : dans le champ nom sur la table 1, dans un champ commentaires dans la table 2 etc... Ce n'est donc pas possible ?

Tu as un livre facile d'accès à me recommander sur le SQL ?

Merci
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2011 à 14:07
J'ai pas de livre à te recommander, désolé

Par contre tu pourras trouver tous les tuto que tu souhaites sur Internet, que ce soit sur le Ring CS ou d'autres (ex. : developpez.com)

Pour ton cas c'est tout à fait possible, prenons un nouvel exemple.
Soit les 2 tables :
tb1 {int id, varchar name, varchar description }
tb2 {varchar code, varchar label, double price }

Rien ne t'empêche de faire :
SELECT name FROM tb1
UNION ALL
SELECT label FROM tb2;

En fait il faut simplement que les types et le nombre de champs sélectionnés dans ta "première" requête correspondent à ceux de la "deuxième" (et il faut qu'un tel regroupement ait un sens ^^ mais techniquement ça fonctionne)
0
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 15:07
Ok je vois et si une 3ème table fait son apparition, quelle est la syntaxe finale ?

En gros j'affiche les enregistrements de name si je trouve une occurrence de name dans label de tb2 OU comments de tb3 ?

Je sais dire si ca se trouve dans tb2 et tb3 par la multiplications des INNER JOIN mais la condition
0
foetus69 Messages postés 7 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 15:55
Merveilleux, j'ai fait un pas de géante grâce à toi !!!!

La commande UNION est à

MERCI MERCI MERCI
0
Rejoignez-nous