IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Jointure multitables SELECT et LIKE


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Autodidacte
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 1
    Points
    1
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'";
    Vous savez pourquoi ?

    Bien cordialement,

    Féfé

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas de valeur commune entre ta table 2 et ta table3.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Autodidacte
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    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

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Autodidacte
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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

  5. #5
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Autodidacte
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    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...

  7. #7
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    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

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Autodidacte
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci de te soucier de mon problème.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  9. #9
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Bonjour (et désolé de mon absence ),

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. De l'aide pour Jointure, avec selection count =0
    Par onemart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/01/2009, 09h01
  2. Problème de jointure avec select
    Par khaoula_14_05 dans le forum SQL
    Réponses: 3
    Dernier message: 22/04/2008, 17h49
  3. Problème de jointure sur Select et Update
    Par Marshall_Mathers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/06/2007, 15h30
  4. [MySQL] Requête SELECT avec LIKE : pb de CASSE
    Par pcayrol dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/06/2007, 20h11
  5. Jointure MultiTable - Ai-je compris ?
    Par etiennegaloup dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/11/2005, 22h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo