Chercher occurrences sur plusieurs tables par la jointure [Résolu]

foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 2 mai 2011 à 12:13 - Dernière réponse : foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 3 mai 2011 à 17:07
3
Merci
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 [..]

Merci cs_jopop 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de cs_jopop
Meilleure réponse
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 4 mai 2011 à 15:37
3
Merci
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.

Merci cs_jopop 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de cs_jopop
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 3 mai 2011 à 16:32
0
Merci
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.
Commenter la réponse de foetus69
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 4 mai 2011 à 09:57
0
Merci
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
Commenter la réponse de foetus69
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 4 mai 2011 à 09:59
0
Merci
Je t'avouerai que la première fois que j'ai tapé la requête dans Toad je l'ai également écrite à l'envers ^^
Commenter la réponse de cs_jopop
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 4 mai 2011 à 11:20
0
Merci
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 ?
Commenter la réponse de foetus69
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 4 mai 2011 à 11:33
0
Merci
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.
Commenter la réponse de cs_jopop
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 4 mai 2011 à 13:56
0
Merci
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
Commenter la réponse de foetus69
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 4 mai 2011 à 14:07
0
Merci
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)
Commenter la réponse de cs_jopop
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 4 mai 2011 à 15:07
0
Merci
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
Commenter la réponse de foetus69
foetus69 7 Messages postés lundi 2 mai 2011Date d'inscription 4 mai 2011 Dernière intervention - 4 mai 2011 à 15:55
0
Merci
Merveilleux, j'ai fait un pas de géante grâce à toi !!!!

La commande UNION est à

MERCI MERCI MERCI
Commenter la réponse de foetus69

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.