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 :

Jointure entre plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 285
    Points : 421
    Points
    421
    Par défaut Jointure entre plusieurs tables
    bonjour à tous,
    j'ai trois tables:
    produit(code,libelle,code_client,code_marque),
    client(code,libelle,contact)
    marque(code,libelle,observation)

    Je souhaite afficher |produit.code|produit.libelle|client.libelle|marque.libelle| pour les lignes où produit.code_client=marque.code_client=client.code.

    Pour cela, j'ai fait la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT p.code,p.libelle,c.Client,m.marque
    FROM produit p
    INNER JOIN client c ON p.Code_Client=c.code
    INNER JOIN marque m ON p.Code_Client=m.Code_Client
    Le résultat n'est pas celui attendu, car dans ma table produit il y a 7 lignes or là il me ramène 12 lignes

    Certaines lignes sont en double avec une comme si il y avait eu un produit cartésien.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Sans plonger dans le détail, ta structure de données parait extrêmement bizarre : un code client dans une table produit, on ne trouve pas ça tous les jours.

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je ne comprends pas trop ta logique
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT p.code,p.libelle,c.Client,m.marque
    FROM produit p
    INNER JOIN client c ON p.Code_Client=c.code
    INNER JOIN marque m ON p.code_marque=m.code
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 285
    Points : 421
    Points
    421
    Par défaut
    je donne un exemple:

    dans ma table produit, j'ai des occurrences suivantes:

    Code sql : 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
    18
    19
     
    produit(id,libelle,code_client,code_marque)
    (1,prod1,1,1)
    (2,prod2,1,2)
    (3,prod3,2,3)
    (4,prod4,2,4)
    (5,prod5,2,5)
     
    client(id,Raison_soc,adress)
    (1,Client1,03 bp 2555)
    (2,Client2,adress2)
    (3,Client3,adress3)
     
    marque(id,libelle,code_client)
    (1,marq1,1)
    (2,marq2,1)
    (3,marq3,2)
    (4,marq4,2)
    (5,marq5,2)

    Alors je souhaiterais avoir comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    resultat(id,lebelle,client,marque)
    (1,prod1,client1,marq1)
    (2,prod2,Client1,marq2)
    (3,prod3,client2,marq3)
    (4,prod4,client2,marq4)
    (5,prod5,client2,marq5)
    Ainsi, les deux dernières au lieu d'avoir des id (de client et marque), je souhaite avoir des libelles de ceux-ci!

    Quelqu'un a une idée?

    Merci d'avance!

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Il y a un souci dans la modélisation... Le code client apparaît dans toutes les tables (produit, client et marque).
    On a l'impression qu'on peut tourner en rond sur ce code client : pour un produit donné, quel code client utiliser ? Celui obtenu directement par la table produit, ou celui obtenu par jointure sur la table marque ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 285
    Points : 421
    Points
    421
    Par défaut
    Le code client dans les autres tables produit et marque est une clé étrangère!
    En faite la table client n'est pas un client au sens propre du terme: c'est un annonceur. Nous l'utilisons ainsi pour les besoins des applications existantes!

    Autrement dit un annonceur communique sur des produits de ses marques!

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Du coup, avec ta jointure initiale, je comprends mieux que tu obtiennes ce que tu a pris pour un produit cartésien.

    Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT p.code,p.libelle,c.Client,m.marque
    FROM produit p
    INNER JOIN client c ON p.Code_Client=c.code
    INNER JOIN marque m ON p.code_marque=m.id
    Là, au moins, il ne devrait plus y avoir de lignes doublées.
    Le risque tout de même, avec ce modèle, c'est que le code client diffère entre marque et produit...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 285
    Points : 421
    Points
    421
    Par défaut
    Citation Envoyé par ced Voir le message
    Du coup, avec ta jointure initiale, je comprends mieux que tu obtiennes ce que tu a pris pour un produit cartésien.

    Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT p.code,p.libelle,c.Client,m.marque
    FROM produit p
    INNER JOIN client c ON p.Code_Client=c.code
    INNER JOIN marque m ON p.code_marque=m.id
    Là, au moins, il ne devrait plus y avoir de lignes doublées.
    Le risque tout de même, avec ce modèle, c'est que le code client diffère entre marque et produit...

    ced
    Effectivement! J'ai résolu le problème avec une requête toute simple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT p.code,p.libelle,c.Raison_soc,m.libelle
    FROM produit p,client c,marque m
    WHERE (p.Code_Client=c.code AND p.Code_Marque=m.code AND p.Code_Client=m.Code_Client);

    Merci à tous!
    Si quelqu'un sait comment optimiser cette requête, je suis preneur.

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par Le gris Voir le message
    Si quelqu'un sait comment optimiser cette requête, je suis preneur.
    Oui, commence par écrire les jointures avec la syntaxe SQL 2 (INNER JOIN... ON...). C'est préférable, pas tant en termes de performance qu'en termes de lisibilité des requêtes.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/05/2015, 13h36
  2. Réponses: 3
    Dernier message: 01/04/2010, 10h04
  3. Jointure entre plusieurs tables
    Par cell dans le forum Pentaho
    Réponses: 7
    Dernier message: 25/03/2010, 12h30
  4. Réponses: 2
    Dernier message: 23/10/2009, 15h02
  5. Problème de Jointure entre plusieurs tables
    Par Stouille89 dans le forum JDBC
    Réponses: 12
    Dernier message: 11/12/2007, 14h16

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