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 :

Jointure sur 3 tables


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut Jointure sur 3 tables
    Bonjour,
    Voici mon PB
    j'ai une table INFO ( qui contient USER_ID, FILE_ID et d'autres info )
    une table USER ( qui contient le USER_iD, le NOM_USER et toutes les infos )
    une table FILE ( qui contient le FILE_ID, le NOM_FILE et toutes les infos )

    moi je désire pour chaque ID de la table A , récupéré le NOM_USER et le NOM_FILE
    Voici ce que j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  INFO_ID,NOM_USER,NOM_FILE from INFO A
    JOIN USER B ON A.NUM_USER_FK=USER_iD
    JOIN FILE C ON C.NUM_FILE_FK=A.NUM_FILE_FK ORDER BY NOM_USER ASC
    Donc j'ai bien une réponse, sauf que les INFO_ID sont doublé exemple j'aurai

    12 TOTO fic1
    12 TOTO fic2
    12 TOTO fic3
    12 TOTO fic4
    Alors qu'en réalité par exemple seul 12 TOTO fic2 est cohérent.

    Merci pour votre aide, car ma pratique du SQL remonte maintenant à quelques années.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    Alors qu'en réalité par exemple seul 12 TOTO fic2 est cohérent.
    Et pourquoi cette ligne serait-elle plus "cohérente" que les autres ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé Avatar de Doracle
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Par défaut
    Avec les jointures en syntaxe "JOIN" tu dois indiquer au serveur dans quel ordre tu fais tes jointures. Le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FROM table1 JOIN table2 ON (...=...) JOIN table3 ON (...=...)
    Donc tu dois joindre la table1 avec la table2, puis la table2 avec la table3.

    Dans ton cas tu ne respectes pas cet ordre donc tu obtiens surement un produit cartésien.

    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  INFO_ID,NOM_USER,NOM_FILE FROM USER B
    JOIN INFO A ON A.NUM_USER_FK=B.USER_iD
    JOIN FILE C ON C.NUM_FILE_FK=A.NUM_FILE_FK ORDER BY NOM_USER ASC
    A tester !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Merci pour vos interventions.
    Pourquoi plus cohérente ?
    car l'id du A.NUM_FILE_FK dans la table INFO = 1
    et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM_FILE from FILE where ID=1
    ça me renvoi bien "fic2"
    Donc moi je veux avoir uniquement la ligne avec le nom du fichier correspondant à l'id de ma table INFO.
    je veux remplacer les ID de USER et FILE se trouvant dans INFO par leur nom respectif se trouvant dans leur table.

    Effectivement j'ai l'impression qu'il y à un produit cartésien.
    J'ai essayé ce que tu me propose, et j'ai encore plus de lignes qu'auparavant en résultat.
    ID_INFO | USER | ID_FILE
    3 | toto | 1

    Je cherche à remplacer ce 1 par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM_FILE from FILE where ID=1
    voila j'espère que j'ai bien résumé mon problème
    merci pour votre aide

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    J'ai trouvé une solution , mais je ne sais pas si c'est la meilleure.
    J'attends vos avis d'experts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  INFO_ID,NOM_USER,(SELECT NOM_FILE FROM FILE WHERE NUM_ID=A.NUM_FILE_ID_FK) as NOM_FIC
    FROM INFO A,USER B
    WHERE A.USER_FK_ID=B.USER_ID
    ORDER BY NOM_USER ASC
    J'obtiens bien

    12 |toto |fic2

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    Pourquoi plus cohérente ?
    car l'id du A.NUM_FILE_FK dans la table INFO = 1
    et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM_FILE from FILE where ID=1
    ça me renvoi bien "fic2"
    Donc moi je veux avoir uniquement la ligne avec le nom du fichier correspondant à l'id de ma table INFO.
    Ben il n'y a pas de WHERE dans la requête de ton premier message donc il ne peut pas sélectionner une ligne plutôt qu'une autre !

    Pas sûr d'avoir tout compris mais essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.INFO_ID, B.NOM_USER, C.NOM_FILE 
    FROM INFO A
    JOIN USER B ON A.NUM_USER_FK = B.USER_ID
    JOIN FILE C ON C.NUM_FILE_FK = A.NUM_FILE_FK 
    WHERE C.ID = 1
    ORDER BY NOM_USER ASC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Salut
    Oui ta réponse fonctionne également elle me renvoi le même résultat.
    Sauf que c'est pour une INFO particulière que je veux récupérer le USER_NAME et le FILE_NAME

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.INFO_ID, B.NOM_USER, C.NOM_FILE 
    FROM INFO A
    JOIN USER B ON A.NUM_USER_FK = B.USER_ID
    JOIN FILE C ON C.NUM_FILE_FK = A.NUM_FILE_FK 
    WHERE A.INFO_ID = 12
    ORDER BY NOM_USER ASC

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    mon problème était le suivant
    TABLE INFO:
    INFO_ID|USER_ID_FK|FILE_ID_FK
    12|33|1
    13|34|2
    14|35|3
    TABLE USER
    USER_ID|USER_NAME
    33|toto
    34|titi
    35|tata
    TABLE FILE
    FILE_ID|FILE_NAME
    1|fic1
    2|fic2
    3|fic3
    et donc moi au final je voulais obtenir

    12|toto|fic1
    13|titi|fic2
    14|tata|fic3
    sauf si je faisait la requete en précisant INFO_ID=12 je voulais obtenir

    12|toto|fic1
    or moi j'obtenais un truc du genre :

    12|toto|fic1
    12|toto|fic2
    12|toto|fic3

Discussions similaires

  1. jointure sur 3 tables
    Par jojo22222 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/01/2006, 23h47
  2. Jointure sur 3 tables
    Par tonymontana4192 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/11/2005, 14h24
  3. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/10/2005, 00h54
  4. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 12h20
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 12h56

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