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 :

Méthodologie sur les jointures


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut Méthodologie sur les jointures
    Bonjour,

    Je me suis aperçu, en faisant des LEFT JOIN, que le nombre de tuples renvoyés peuvent souvent etre différent du résultat escompté.

    Comment faire pour etre sur (quand on fait des LEFT JOIN) que le nombre de tuples renvoyés soit égal au nombre de tuples trouvés pour la clause WHERE ?

    par exemple une table A
    id libelle
    1 a
    2 b
    3 c

    une table B
    id id_join libelle_b
    1 1 toto
    2 1 titi
    3 2 j
    4 3 h

    Si on fait ceci, on obtiendra deux tuples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select A.libelle, B.libelle
    FROM A LEFT JOIN B ON A.id=B.id_join
    WHERE id=1;
    je voudrai plutot en recuperer qu'un seul car ma clause WHERE ne trouve qu'un seul tuple dans la table A. Par defaut on pourrait prendre la premiere ligne rencontrée dans la table B.

    Y a t'il une solution ?

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 142
    Points : 185
    Points
    185
    Par défaut
    Salut,

    dans ta clause Where, tu ne précises pas sur quel id tu filtres (je suis même étonné que MySQL laisse passer ça, SQL Server renvoie un message d'erreur lui).
    Si tu filtres sur le id de A, il est normal que ta requête renvoie 2 résultats. Si tu filtres sur le id de B, tu verras qu'un seul enregistrement est retourné.
    "Le problème du monde, c'est que les imbéciles sont présomptueux et les gens intelligents bourrés de doutes" B. Russell

  3. #3
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Tu as raison pour la clause where, c'est bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT A.libelle, B.libelle
    FROM A LEFT JOIN B ON A.id=B.id_join
    WHERE A.id=1;
    Mais justement je voulais limiter le nombre d'enregistrements retournés, au nombres d'enregistrements répondants à la clause WHERE dans la table A.

    Donc le LEFT JOIN ne doit doit pas etre approprié

    quelqu'un a une solution ?

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 142
    Points : 185
    Points
    185
    Par défaut
    Donc tu ne souhaites retourner qu'un seul enregistrement où A.id=1.
    Sauf que tu réalises une jointure avec la table B où il y a 2 enregistrements avec id_join=1, donc que ce soit avec un LEFT JOIN, un INNER JOIN, un WHERE, tu auras FORCEMENT tes 2 enregistrements de retournés (c'est un peu le principe d'une jointure !). Car sinon comment le serveur de données pourrait choisir entre les 2 libelle_b de la table B à retourner ??

    Il n'a pas d'opérateur qui réalise directement ce que tu veux.

    Par contre, tu peux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.libelle, MAX(B.libelle_b) as libelle_b FROM A
    INNER JOIN B ON A.id=B.id_join
    WHERE A.id=1
    GROUP BY A.libelle
    edit: Je viens de penser à qqch qui te satisfera peut-être plus si tu veux vraiment le 1er enregistrement rencontré (en considérant que c'est celui qui a le B.id le plus petit) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.libelle, B.libelle_b FROM A
    INNER JOIN B ON A.id=B.id_join
    WHERE A.id=1 AND B.id=(SELECT MIN(B.id) FROM B)
    "Le problème du monde, c'est que les imbéciles sont présomptueux et les gens intelligents bourrés de doutes" B. Russell

  5. #5
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Merci pour ces solutions.

    je comprenai bien que le principe de la jointure etait bien de renvoyer toutes les solutions rencontrés mais je voulais voir si il existait quelque chose pour limiter le nombre d'enregistrements.

    ce que je peux faire aussi c'est un curseur avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT A.libelle
    FROM A
    WHERE id=1;
    puis ensuite dans mon curseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT B.libelle
    INTO ...
    FROM B 
    WHERE id_join=1;
    encore merci

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

Discussions similaires

  1. Aides sur les jointures
    Par JmL40 dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/01/2008, 13h48
  2. Question théorique (facile) sur les jointures
    Par chateau_dur dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/12/2007, 01h12
  3. Réponses: 5
    Dernier message: 19/09/2007, 14h23
  4. Question sur les jointures
    Par richard038 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2006, 11h46
  5. question de débutant sur les jointures
    Par dreamcocktail dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2006, 15h24

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