JOIN vous avez dit JOIN ?

Eléphant du PHP | 363 Messages

29 avr. 2011, 10:54

Bonjour et merci xTG.

La jointure externe ne fait pas forcément une correspondance c'est l'équivalent quoiqu'il arrive d'un SELECT * from ma table, c'est bien ça ?

Sinon j'ai utilisé l'INNER JOIN :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'";
J'ai rajouté un % autour de t2.champ2 mais mon enregistrement toto de table3 ne ressort pas plus pour autant.

Normal ? Pourquoi ?

P'tite fée
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 363 Messages

02 mai 2011, 11:38

Bonjour,

J'ai persisté ce week-end mais ne vois toujours pas comment faire :(
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'"
Si le champ nom de la table 3 contient "toto" et que le champ2 de la table 2 contient aussi "toto" ca devrait fonctionner normalement avec cette syntaxe, non ?

F69
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

ViPHP
xTG
ViPHP | 7331 Messages

02 mai 2011, 13:34

Avec cette syntaxe tu recherches la chaîne t2.champ2 et non la valeur contenu dans t2.champ2 :)
Aucune idée de comment on incorpore un champ plutôt qu'une valeur dans un LIKE...
Cependant pour tester si t2.champ2 contient uniquement "toto" tu peux remplacer le LIKE par une égalité et tu verras que la jointure fonctionne.

Eléphant du PHP | 363 Messages

03 mai 2011, 16:31

Bonjour,

J'ai essayé autre chose :
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.

On peut pas matcher de la sorte ?

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

?
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 275 Messages

03 mai 2011, 17:29

Avec cette syntaxe tu recherches la chaîne t2.champ2 et non la valeur contenu dans t2.champ2 :)
Aucune idée de comment on incorpore un champ plutôt qu'une valeur dans un LIKE...
LIKE CONCAT('%', t2.champ2, '%')

Eléphant du PHP | 363 Messages

04 mai 2011, 10:09

MERCI A TOUS !!!

On m'a montré où était mon erreur :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE CONCAT('%', t2.champ2, '%')"; //ne marche pas
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t2.champ2 LIKE CONCAT('%',t3.nom,'%')"; //fonctionne
Comme mentionné sur un autre forum, je n'avais pas bien saisi le sens du ON et l'ordre a son importance ;)

C'est RESOLU, encore MERCI !!!!!!!!!!!!!!!
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 363 Messages

04 mai 2011, 11:29

Re re re,

Dernière chose puisque c'est encore une syntaxe...

Je sais faire trouver une occurrence sur plusieurs tables (plusieurs INNER) mais pas sur soit la table 1 ou la table 2.

Quelqu'un sait comment faire une jointure sur une table OU bien une autre ?

Par avance merci.
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

ViPHP
xTG
ViPHP | 7331 Messages

04 mai 2011, 13:40

Avec LEFT ou RIGHT afin de ne pas avoir une égalité parfaite. ;)

Eléphant du PHP | 363 Messages

04 mai 2011, 16:45

Re coucou,

Le LEFT et le RIGHT c'est dans le cas de 2 tables, non ?

Mais si ca concerne 3 tables ou plus ?

En tout cas c'est gentil de ta part de te pré-occuper de moi de la sorte.

F69
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

ViPHP
xTG
ViPHP | 7331 Messages

05 mai 2011, 08:09

Code : Tout sélectionner

SELECT table1.id, table2.id, table3.id FROM table1 INNER JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id
Cela revient à l'égalité stricte entre table1 et table2.
Puis au résultat précédent complété avec les valeurs concordantes dans table3. Si des valeurs n'existent pas dans table3 elles seront à null.

Tu pourrais donc obtenir par exemple :
table1.id | table2.id | table3.id
1 | 1 | 1
2 | 2 | NULL
3 | 3 | 3
4 | 4 | NULL