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

Requêtes MySQL Discussion :

Liaison conditionnelle entre 2 tables


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 31
    Points
    31
    Par défaut Liaison conditionnelle entre 2 tables
    Bonjour,

    Je ne suis pas sûr que mon titre soit très explicite mais voici mon problème :

    2 tables
    - client (id, nom, prenom)
    - client_info (id_client, adresse, ville...)

    (Il s'agit d'un exemple simplifiant la situation réelle)

    Le but est de faire une recherche sur ces deux tables, du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM client, client_info
    WHERE client.id = client_info.client_id
    AND (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")
    Jusque là rien de sorcier, mon problème interviens lorsque il n'existe pas d'enregistrement dans "client_info" correspondant à un enregistrement "client", la liaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.id = client_info.client_id
    n'est plus respecté et même si il existe un client dont le nom correspond aux mots clés, l'enregistrement ne ressortira pas.

    Ma question est donc la suivante :

    Est-il possible de rendre optionnel la prise en compte de la liaison ?

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * FROM client, client_info
    WHERE (
    client.id = client_info.client_id OR 
    NOT EXISTS(
    SELECT client_id FROM client_info WHERE client_info.id = client.id
    )
    )
    AND (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")
    Mais sans résultats.


    Merci pour votre aide.


    Thomas

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    En utilisant le SQL normalisé, on peut faire ça avec la clause LEFT JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM client 
    LEFT JOIN client_info ON client.id = client_info.client_id
    WHERE (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")

  3. #3
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut jointure externe
    Bonjour,
    Je vous invite à prendre quelques jours pour apprendre un peu plus sql, c'est nécessaire si vous voulez parfaitement maitriser le résultat recherché.
    A moins de n'avoir rien compris, votre problème est très simple.

    D'abord, je vous invite à oublier cette syntaxe pour les jointures et utiliser JOIN à la place (dernière norme sql).
    Ensuite, lorsque vous voulez joindre deux tables, vous avez le choix d'indiquer au moteur de prendre (pour mysql) :
    - soit toutes les lignes avec des valeurs communes aux deux tables (INNER JOIN)
    - soit toutes les lignes de la table 1 et seulement les lignes de la table 2 pour lesquelles il y a une valeur commune (LEFT OUTER JOIN)
    - soit toutes les lignes de la table 2 et seulement les lignes de la table 1 pour lesquelles il y a une valeur commune (RIGHT OUTER JOIN)
    (sur d'autres bdd il y a aussi FULL JOIN ...)

    Si je comprends bien votre modèle, la table client_info contient les données facultatives, donc vous devez modifier votre requête et l'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM client t1
    LEFT OUTER JOIN client_info t2 ON t2.client_id = t1.id
    WHERE t1.nom LIKE "%motclés%" OR t2.adresse LIKE "%motclés%"
    J'espère vous avoir aider, si vous avez le temps, regarder la rubrique "livres", ceux de "Christian Soutou" sont bien fait je trouve.

    Bon courage

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 31
    Points
    31
    Par défaut
    Merci à vous deux, c'est parfais.

    patic je prends note de votre remarque Je vais d'ailleurs de ce pas regarder un peu le livre que vous me proposez !


    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2012, 14h05
  2. [AC-2007] Liaison dinamyque entre 2 tables différentes
    Par troylee dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/07/2011, 13h20
  3. [AC-2003] Liaison invisible entre 2 tables en mode requete
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/08/2009, 15h22
  4. [AC-2007] Calcul conditionnel entre deux tables
    Par Wanaka dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 27/04/2009, 10h51
  5. [BO XI] liaison direct entre 2 tables de fait ?
    Par jibjib dans le forum Designer
    Réponses: 2
    Dernier message: 03/06/2008, 10h05

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