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

Langage SQL Discussion :

Probléme de jointure


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut Probléme de jointure
    Bonjour je suis sous mysql et j'ai un problème de jointure, indépendant, je pense de la base. C'est pourquoi je met ce message ici.

    J'ai deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    CREATE TABLE `modes_livraisons` (
      `mode_livraison_id` int(11) NOT NULL auto_increment,
      `mode_livraison_libelle` varchar(50) NOT NULL default '',
      `mode_livraison_cout` decimal(10,2) NOT NULL default '0.00',
      `mode_livraison_langue` int(11) NOT NULL default '0',
      PRIMARY KEY  (`mode_livraison_id`)
    ) ;
     
    INSERT INTO `modes_livraisons` VALUES (1, 'mode de livraison1', '12.00',  1);
    INSERT INTO `modes_livraisons` VALUES (2, 'mode de livraison2', '20.00',  1);
    INSERT INTO `modes_livraisons` VALUES (3, 'mode de livraison3', '30.00',  1);
    INSERT INTO `modes_livraisons` VALUES (4, 'mode livraison anglais', '11.00',  2);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE produits_livraisons (
      produit_livraison_livraison int(11) NOT NULL default '0',
      produit_livraison_produit int(11) NOT NULL default '0',
      PRIMARY KEY  (produit_livraison_livraison,produit_livraison_produit)
    ) ;
     
    INSERT INTO produits_livraisons VALUES (1, 28);
    INSERT INTO produits_livraisons VALUES (1, 29);
    INSERT INTO produits_livraisons VALUES (1, 30);
    INSERT INTO produits_livraisons VALUES (1, 31);
    INSERT INTO produits_livraisons VALUES (2, 29);
    INSERT INTO produits_livraisons VALUES (3, 28);
    INSERT INTO produits_livraisons VALUES (3, 31);
    Ceci me permet d'avoir des modes de livraison et d'associer des modes de livraisons à des produits (J'ai juste mis la table qui relie les produis aux modes).

    Ce que je souhaiterais obtenir c'est si un produit est lié ou pas à un mode de livraison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pour le produit 28 :
    Mode_livraison_id  mode_livraison_libelle produit_livraison_id
    --------------------  -------------------------  ----------------------
    1                         Mode de livraison 1       28 
    2                         Mode de livraison 2       NULL
    3                         Mode de livraison 3       28
    Voila quelque chose dans le genre qui me liste l'ensemble des modes de livraison et qui me dit si le produit y est associé ou non.

    J'ai essayé avec une jointure externe mais ca ne me retourne pas le bon résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT `mode_livraison_id` , `mode_livraison_libelle`, produit_livraison_livraison, produit_livraison_produit
    FROM  `modes_livraisons` 
    LEFT JOIN produits_livraisons ON produit_livraison_livraison = mode_livraison_id
    WHERE produit_livraison_produit = 28 OR produit_livraison_produit IS NULL
    Ca ne me retourne que deux lignes et ca ne me dit pas que pour le mode 2 il n'y a rien.

    Merci

    PS : Si le sujet n'est pas à sa place je suis dsl

  2. #2
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 36
    Par défaut
    hello.
    tu as essayé avec un full join au lieu d'un left join ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Oui c'est pas mieux. Enfait c'est pas très important que ca m'affiche l'id produit. Si je peux avoir un résultat de ce genre ca m'irra aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pour le produit 28 :
    Mode_livraison_id  mode_livraison_libelle result
    --------------------  -------------------------  ----------------------
    1                         Mode de livraison 1       x
    2                         Mode de livraison 2       NULL
    3                         Mode de livraison 3       x
    Comme ca je saurais que le produit 28 n'est pas lié au mode de livraison 2

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut Re: Probléme de jointure
    Citation Envoyé par Ajrarn
    Ca ne me retourne que deux lignes et ca ne me dit pas que pour le mode 2 il n'y a rien.
    sous Oracle j'obtiens le résultat suivant :

    MODE_LIVRAISON_ID MODE_LIVRAISON_LIBELLE PRODUIT_LIVRAISON_LIVRAISON PRODUIT_LIVRAISON_PRODUIT
    ----------------- -------------------------------------------------- --------------------------- -------------------------
    1 mode de livraison1 1 28
    3 mode de livraison3 3 28
    4 mode livraison anglais
    qu'est ce qui ne te convient pas ?

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    J'ai compris ton problème

    2 n'est simplement pas afficher parce que produit_livraison_produit=29 et pas 28 ni NULL

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Voui c'est le soucis. En fait je sais pas si c'est meme faisable avec une base de données ce genre de requete. Ou peut etre avec une sous requete mais je ne suis pas sur une version de mysql qui les prends en compte mais ca m'interesse de savoir si quelqu'un a une idée.

    Donc j'essaye de formuler autrement ce que je souhaiterais obtenir :
    La liste des modes de livraison et une valeur (n'importe laquelle) qui m'indiquera pour l'id produit que je souhaite si il est associé ou non à un mode de livraison (ca peut etre un booléen, un NULL, ...)
    J'ai essayé plein de jointures et de conditions différentes mais rien

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    dans ce cas, il faut simplement supprimer la clause WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mode_livraison_id , mode_livraison_libelle, produit_livraison_livraison, produit_livraison_produit
      2  FROM  modes_livraisons
      3  LEFT OUTER JOIN produits_livraisons ON produit_livraison_livraison = mode_livraison_id;
    MODE_LIVRAISON_ID MODE_LIVRAISON_LIBELLE PRODUIT_LIVRAISON_LIVRAISON PRODUIT_LIVRAISON_PRODUIT
    ----------------- -------------------------------------------------- --------------------------- -------------------------
    1 mode de livraison1 1 28
    1 mode de livraison1 1 29
    1 mode de livraison1 1 30
    1 mode de livraison1 1 31
    2 mode de livraison2 2 29
    3 mode de livraison3 3 28
    3 mode de livraison3 3 31
    4 mode livraison anglais

    8 ligne(s) sélectionnée(s).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Oui c'est une solution mais ca implique que si j'ai déjà juste 50-60 produits ca va me retourner un paquet de lignes et c pas top du tout .

    Je vois vraiment pas comment faire. Est ce qu'une sous requete ne pourrait pas résoudre ce pb. Je ne connais pas du tout ce type de requetes!

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    bah moi je vois pas ce que tu veux

    tu veut regrouper par mode_livraison_id ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT mode_livraison_id , mode_livraison_libelle, produit_livraison_livraison, count(produit_livraison_produit)
    FROM  modes_livraisons
    LEFT JOIN produits_livraisons ON produit_livraison_livraison = mode_livraison_id
    group by mode_livraison_id , mode_livraison_libelle, produit_livraison_livraison
    MODE_LIVRAISON_ID MODE_LIVRAISON_LIBELLE PRODUIT_LIVRAISON_LIVRAISON COUNT(PRODUIT_LIVRAISON_PRODUIT)
    ----------------- -------------------------------------------------- --------------------------- --------------------------------
    1 mode de livraison1 1 4
    2 mode de livraison2 2 1
    3 mode de livraison3 3 2
    4 mode livraison anglais 0

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Ce que je voudrais obtenir c'est la liste des modes de livraison et associé à chaque mode de livraison, pour un produit_id donné, si il y a une association entre les deux.
    Ceci me permettra, pour un produit donné, de lister tout les modes de livraison possible et savoir quels sont ceux qui sont associés au produit et ceux qui ne le sont pas.

    J'arrive à le faire mais en faisant plusieurs requetes mais j'aurais voulu le faire en une seule. Si c'est pas possible tant pis!!

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    La solution en SQL normatif (SQL:1992) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT mode_livraison_id,  mode_livraison_libelle, 
           CASE 
              WHEN p.produit_livraison_livraison = m.mode_livraison_id THEN 'OUI'
              ELSE 'NON'
           END
    FROM   modes_livraisons m
           LEFT OUTER JOIN produits_livraisons p
                 ON p.produit_livraison_livraison = m.mode_livraison_id 
                    AND  produit_livraison_produit = 28
    Au passage les colonnes ayant la même sémantique doivent avoir le même nom !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    donnes donc la liste de tes requêtes et on verra

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    >>orafrance : En fait je faisais deux requetes, une me donnant la liste des modes de livraison et une autre me donnant l'association d'un produit à des modes de livraison. Ensuite dans mon programme, avec un tableau je comparais tout ca et je l'affichais. En tout cas merci pour ton aide, la solution de M. Brouard est exactement ce que je voulais.

    Merci pour la requete, c'est exactement ca et ca fonctionne impec avec mon mysql.

    Au passage les colonnes ayant la même sémantique doivent avoir le même nom !
    Quand tu dis ca, c'est pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON p.produit_livraison_livraison = m.mode_livraison_id
    qui devrait etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON p.mode_livraison_id = m.mode_livraison_id
    avec les champs de la table modifiés en conséquence?

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est encore la norme SQL qui m'a piégé


  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Lol, J'avais pas du tout pensé à coupler distinct avec case avec la jointure
    Je revais bosser mon sql à bloc là!!!

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

Discussions similaires

  1. Problème requête jointure
    Par Isa31 dans le forum Langage SQL
    Réponses: 36
    Dernier message: 16/05/2005, 13h46
  2. Problème de jointure de tables
    Par AurelBUD dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2005, 16h27
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 15h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 21h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27

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