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 avec trois tables.


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut Jointure avec trois tables.
    Bonjour.

    Je n'ai pas de jointure directe de la table exemplaires sur la table empr. Il faut que je passe par la table pret.

    - Dans ma table empr nommée l (pour lecteurs) j'ai :
    id_empr
    empr_cb
    empr_nom
    - Dans ma table exemplaires nommée e j'ai :
    expl_id
    expl_cb
    expl_statut
    - Dans ma table pret nommée p j'ai :
    pret_idempr
    pret_idexpl
    - Dans ma table notices nommée n j'ai :
    tit1
    notice_id

    Les jointures possibles sont :
    - De exemplaires sur notices
    expl_notice = notice_id
    - De exemplaires sur pret
    expl_id = pret_idexpl
    - De pret sur empr
    id_empr = pret_idempr

    La condition que je voudrais remplir porte sur la table exemplaires est expl_statut=12
    Au final je veux obtenir une liste avec affichage des colonnes empr_nom, expl_cb, tit1 répondant à la condition expl_statut=12

    Cette requête fonctionne mais ne me permet pas d'obtenir empr_nom dans une de mes colonnes parce que je ne sais pas comment faire la jointure.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e.expl_cb as 'Code barres', e.expl_cote as 'Côte', n.tit1 AS 'Titre'
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id=e.expl_notice
    WHERE expl_statut=12
    ORDER BY e.expl_cote

    J'ai essayé cette requête un peu naïvement
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT l.empr_nom as 'Nom', e.expl_cb as 'Code Barres', n.tit1 as 'Titre'
    FROM notices n, pret p, exemplaire e, empr l, notices n
    WHERE e.expl_statut=12
    	AND e.expl_notice = n.notice_id
    	AND e.expl_id = p.pret_idexpl
    	AND l.id_empr = p.pret_idempr

    mais la réponse est :
    1146 - Table 'biblio_prayssas.exemplaire' doesn't exist. biblio_prayssas est le nom de ma base.
    Celle-là aussi mais sans succès
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT l.empr_nom as 'Nom', e.expl_cb as 'Code Barres', n.tit1 as 'Titre'
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id=e.expl_notice
    INNER JOIN pret p ON e.expl_id = p.pret_idexp
    INNER JOIN empr l ON l.id_empr = p.pret_idempr
    WHERE e.expl_statut=12

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 804
    Points : 34 074
    Points
    34 074
    Billets dans le blog
    14
    Par défaut
    Il suffit de parcourir l'association entre les tables et de la reproduire dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT l.empr_nom
    	e.expl_cb AS 'Code barres',
    	e.expl_cote AS 'Cote',
    	n.tit1 AS 'Titre'
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id=e.expl_notice
    INNER JOIN pret p ON p.pret_idexpl = e.expl_id
    	INNER JOIN empr l ON l.id_empr = p.pret_idempr
    WHERE e.expl_statut=12
    ORDER BY e.expl_cote
    Au passage...
    L'exemplaire monte une côte ?
    On écrite "cote" sans accent !

    Et ta dernière requête, oublie la vite, surtout ses jointures obsolètes depuis 20 ans alors que tu sais faire les jointures normalisées !

  3. #3
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Côte difficile à monter alors...

    J'obtiens avec la requete que tu viens de me donner :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.expl_cb AS 'Code barres', e.expl_cote AS 'Cote', n.tit1 AS 'Titre' FROM exemp' at line 2

  4. #4
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Je n'avais pas vu l'erreur dans le code sql.
    La bonne requête est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	l.empr_nom as 'Nom',
    	e.expl_cb AS 'Code barres',
    	e.expl_cote AS 'Cote',
    	n.tit1 AS 'Titre'
    FROM exemplaires e
    INNER JOIN notices n ON n.notice_id=e.expl_notice
    INNER JOIN pret p ON p.pret_idexpl = e.expl_id
    	INNER JOIN empr l ON l.id_empr = p.pret_idempr
    WHERE e.expl_statut=12
    ORDER BY e.expl_cote

    Merci.

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 804
    Points : 34 074
    Points
    34 074
    Billets dans le blog
    14
    Par défaut
    Oui, effectivement, j'avais oublié une virgule après l'ajout de la colonne l.empr_nom.

  6. #6
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Alors, pas tout à fait résolu parce que je me suis rendu compte que si la condition e.expl_statut=12 est vérifiée alors que p.pret_idempr n'existe pas aucune ligne n'apparaît dans le résultat.
    J'aimerais que même si p.pret_idempr est vide une ligne de résultat me soit affichée avec la colonne 'Nom' vide ou une chaîne de caractères comme 'Dans la bibliothèque' par exemple.
    Si je savais quelle fonction utiliser je tenterais le coup mais là...

  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 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

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

    Dans ce cas, il faut passer par des jointures externes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	l.empr_nom AS 'Nom',
    	e.expl_cb AS 'Code barres',
    	e.expl_cote AS 'Cote',
    	n.tit1 AS 'Titre'
    FROM exemplaires e
    INNER JOIN notices n ON e.expl_notice = n.notice_id
    LEFT JOIN pret p ON e.expl_id = p.pret_idexpl
    	LEFT JOIN empr l ON p.pret_idempr = l.id_empr
    WHERE e.expl_statut=12
    ORDER BY e.expl_cote

  8. #8
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Merci, cette requête fonctionne parfaitement mais j'ai du mal à comprendre toute la logique de la jointure externe.
    Pourquoi par exemple si je mets RIGHT au lieu de LEFT le fait que p.pret_idempr n'existe pas m'enlève des résultats ?
    Pourquoi aussi si j'utilise FULL j''obtiens une erreur ?

    Je pense que je vais me procurer un bon livre qui traite de tout ça...

  9. #9
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 804
    Points : 34 074
    Points
    34 074
    Billets dans le blog
    14
    Par défaut
    Voir le cours de SQLPro sur les jointures.

    Et c'est aussi lui qui a écrit le livre référence du SQL. Voir sur la page principale de son site.

  10. #10
    Membre à l'essai
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Septembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bibliothécaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Oui, je l'ai en marque page et je l'ai lu plusieurs fois mais c'est pas évident...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2014, 23h14
  2. Jointure avec trois tables sous Talend
    Par NFHnv dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 22/11/2012, 17h28
  3. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/05/2008, 00h07
  4. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 21h24
  5. Jointure avec trois tables, je n'y arrive pas.
    Par sunshine33 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/02/2007, 10h52

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