Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/04/2011, 15h29   #1
Invité de passage
 
Femme
Autodidacte
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Autodidacte

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Par défaut Jointure multitables SELECT et LIKE

Bonjour,

Je suis nouvelle, ceci est mon premier post. J'espère que quelqu'un pourra m'aider à progresser

J'ai créé 3 tables pour comprendre le principe des jointures
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
table1
nom  
titi 
toto 
tata 
tutu 
 
 
table2
champ1 | champ2 | champ3  
azerty | tutu | Je suis ravi 
qui suis-je ? | il en va de la vie de toto | oh oh oh 
 
 
table3
prenom | nom | age  
juste | toto | 18
Mon idée c'est que dès que je trouve une instance de toto dans la table 1 ou 2 j'affiche l'enregistrement table 3 en conséquence.

Voici ce que j'ai écrit mais ca ne marche pas...
Code :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'";
Vous savez pourquoi ?

Bien cordialement,

Féfé
foetus69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 16h16   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tu n'as pas de valeur commune entre ta table 2 et ta table3.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 01h15   #3
Invité de passage
 
Femme
Autodidacte
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Autodidacte

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Bonsoir,

Bah j'ai un "toto" (champ nom table 3)
et une occurrence de "toto" (il en va de la vie de toto) dans (champ2 table2)

C'est ce que je voudrais et ca marche pas malgré le like
foetus69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 11h40   #4
Invité de passage
 
Femme
Autodidacte
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Autodidacte

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Bonjour,

J'ai persisté ce week-end mais ne vois toujours pas comment faire

Code :
$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 ?

KF
foetus69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 16h46   #5
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Bonjour,

Je ne suis pas sûr à 100% mais j'ai l'impression qu'il s'agit d'un problème de syntaxe SQL. Dans la fin de ta requête, tu mets LIKE '%t2.champ2%', comme si t2.champ2 était la chaine de caractère sur laquelle tu voulais faire ta requête (ce qui n'est pas le cas, tu souhaites restreindre sur la chaine de caractère 'toto').
Ta requête devrait plutôt être de la forme :

Code :
1
2
SELECT t3.*
FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE CONCAT('%', t2.champ2, '%')
Tiens-nous au courant du résultat
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 14h33   #6
Invité de passage
 
Femme
Autodidacte
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Autodidacte

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Bonjour et merci de ton aide.

Ca fait plaisir d'avoir du soutien.

J'avais déjà testé le CONCAT mais même avec ta syntaxe qui est encore mieux que la mienne testée ca ne marche pas plus

C'est quoi le binz' ? Il faut des valeurs exactes pour que ca marche les jointures, ca serait étonnant...
foetus69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 16h32   #7
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Le problème que je voyais, c'était que tu mettais t2.champ2 au sein d'une chaine de caractères (car entouré de guillemets doubles). Avec la méthode concat, je ne mettais aucun guillemet double autour de t2.champ2 pour qu'il soie bien interprété. En gros :

t3.nom LIKE '%t2.champ2%' est équivalent à t3.nom LIKE '%t2.champ2%'
tandis que
t3.nom LIKE CONCAT('%', t2.champ2, '%') est équivalent à t3.nom LIKE '%toto%'

Ça me paraît bizarre que cela ne fonctionne pas. Essaye du coup de commencer par mettre en dur un LIKE '%toto%' pour voir si tu obtiens bien ce que tu souhaites.
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 11h30   #8
Invité de passage
 
Femme
Autodidacte
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Autodidacte

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Bonjour et merci de te soucier de mon problème.

On m'a montré où était mon erreur :

Code :
1
2
3
$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
J'ai fait une inversion après le ON dans ma syntaxe. Je n'avais pas bien compris le sens du ON mais c'est mieux.

Par contre, pour finir, sais-tu comment dire cherche sur table1 ou table2 avec les inner. En multipliant les INNER j'ai vu comment dire sur table 1 et table 2 mais je ne sais pas comment placer ma condition OU.

Tu saurais dire ?
foetus69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h25   #9
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Bonjour (et désolé de mon absence ),

D'une manière générale, les jointures fonctionnent avec la syntaxe suivante :

Code :
 table1 JOIN table2 ON condition de jointure
(cela fonctionne aussi avec INNER JOIN, LEFT OUTER JOIN, …).

Après, tu as la possibilité de les imbriquer auquel cas je te conseille d'utiliser un maximum de parenthèses (quitte à en avoir trop, c'est toujours mieux que de ne pas en avoir assez) et de bien identer ta requête pour ne pas t'y perdre :

Code :
1
2
3
4
5
 
SELECT *
FROM ((table1 JOIN table2 ON table1.chp1 = table2.chp2) AS table12
      JOIN table3 ON table12.champ3 = table3.champ4)
      ...
Tu pourras ainsi en imbriquer autant que tu le souhaites.
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h21.


 
 
 
 
Partenaires

Hébergement Web