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 :

[MySQL] Jointures externes SQL (débutant)


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut [MySQL] Jointures externes SQL (débutant)
    Bonjour à tous,

    Je cherche à écrire une requête SQL mais je n'obtiens pas les résultats que j'espère.
    J'ai trois tables: "Membres", "Albums" et "Albums_Photos"; les tables Albums et Albums_Photos ont une colone "AuteurID" qui renvoient toutes les deux vers une colone "ID" de ma table "Membres".
    Je voudrais obtenir une requête qui me sélectionne tous les champs de la table des Membres et qui me totalise le nombre d'albums postés et le nombre de photos postées. Alors j'ai écrit ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select `membres`.*,count(`albums`.`ID`) AS `nbAlbums`,count(`albums_photos`.`ID`) AS `nbPhotos`
    from `albums` left join `membres` on(`albums`.`AuteurID` = `membres`.`ID`)
    left join `albums_photos` on(`albums_photos`.`AuteurID` = `membres`.`ID`)
    group by `membres`.`Pseudo`;
    ...mais MySQL ne me liste que les membres ayant posté un album et pas ceux qui n'ont posté que des photos...

    Pouvez-vous m'expliquer mon erreur? Visiblement j'ai mal compris ce tutoriel... Merci!

  2. #2
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Bonjour,

    Dans ta requête il faut en effet faire une jointure externe comme tu as mis dans le titre du sujet, mais ce n'est pas ce que tu fais. Il faut employer le mot clé OUTER.

    Je ne sais pas si ça va donner le résultat que tu cherches, mais c'est comme ça qu'on fait une jointure externe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select `membres`.*,count(`albums`.`ID`) AS `nbAlbums`,count(`albums_photos`.`ID`) AS `nbPhotos`
    from `albums`
    left outer join `membres` on(`albums`.`AuteurID` = `membres`.`ID`)
    left outer join `albums_photos` on(`albums_photos`.`AuteurID` = `membres`.`ID`)
    group by `membres`.`Pseudo`;
    La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
    -----------------------------------------------------------
    Retrouvez mes articles informatique sur mon Site Developpez.
    Le reste, sur le Site perso !


  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par Glumph
    Je voudrais obtenir une requête qui me sélectionne tous les champs de la table des Membres et qui me totalise le nombre d'albums postés et le nombre de photos postées. Alors j'ai écrit ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select `membres`.*,count(`albums`.`ID`) AS `nbAlbums`,count(`albums_photos`.`ID`) AS `nbPhotos`
    from `albums` left join `membres` on(`albums`.`AuteurID` = `membres`.`ID`)
    left join `albums_photos` on(`albums_photos`.`AuteurID` = `membres`.`ID`)
    group by `membres`.`Pseudo`;
    ...mais MySQL ne me liste que les membres ayant posté un album et pas ceux qui n'ont posté que des photos...
    Pouvez-vous m'expliquer mon erreur? Visiblement j'ai mal compris ce tutoriel... Merci!
    Ca marchera mieux comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  `membres`.*
        ,   COUNT(`albums`.`ID`)        AS `nbAlbums`
        ,   COUNT(`albums_photos`.`ID`) AS `nbPhotos`
    FROM
            `membres` 
        LEFT JOIN 
            `albums` 
            ON  (`albums`.`AuteurID` = `membres`.`ID`)
        LEFT JOIN 
            `albums_photos` 
            ON  (`albums_photos`.`AuteurID` = `membres`.`ID`)
    GROUP BY
            `membres`.`Pseudo`
    ;
    Rappel de la théorie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  *
    FROM    A
        LEFT JOIN
            B
            ON  A.id = B.id
    ;
    Toutes les lignes de A et celles de B qui correspondent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  *
    FROM    A
        RIGHT JOIN
            B
            ON  A.id = B.id
    ;
    Toutes les lignes de B et celles de A qui correspondent...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  *
    FROM    A
        INNER JOIN
            B
            ON  A.id = B.id
    ;
    Seulement les lignes de B et celles de A qui correspondent...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Est-ce ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. Optimisation requête avec jointure externe SQL Server
    Par ICEMAN_60 dans le forum Développement
    Réponses: 2
    Dernier message: 28/11/2011, 10h08
  2. Opérateur MySQL jointure externe
    Par gdavin dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/06/2008, 20h43
  3. [SQL] Jointure externe dans "les 2 sens"
    Par Bounty Killer dans le forum Oracle
    Réponses: 3
    Dernier message: 04/05/2006, 10h56
  4. [SQL] jointure externe
    Par Sniper37 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/09/2005, 15h06
  5. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13

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