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 :

multiples COUNT et JOIN


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [Résolu] multiples COUNT et JOIN
    Bonjour à vous !

    Apparement je ne suis pas le seul à avoir du mal avec les jointures externes, mais je n'ai pas trouvé de solution à mon problème dans les messages précédents

    Je dispose de deux tables : "rubrique" et "bloc" fonctionnant un peu sur le principe d'un forum.
    - Rubrique contient un id_rubrique (clé primaire) et un id_parent (faisant référence à id_rubrique) indiquant si une rubrique est une sous-rubrique (si id_parent != 0) et dans ce cas, de quelle rubrique parent elle dépend.
    - Bloc contient un id_rubrique selon la rubrique à laquelle elle appartient.

    Je cherche à trouver pour toutes les rubriques, le nombre de sous rubrique (s'il y en a) ainsi que le nombre de blocs (s'il y en a) qui lui sont rattaché. J'utilise pour cela la requête suivante (sous MySQL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT r.id_rubrique, r.libelle, 
    COUNT(r2.id_rubrique) AS nb_sous_rubriques, COUNT(b.id_bloc) AS nb_blocs 
     FROM web_rubrique r 
     LEFT JOIN web_rubrique r2 ON r.id_rubrique = r2.id_parent 
     LEFT JOIN web_bloc b ON r.id_rubrique = b.id_rubrique  
     WHERE r.id_parent = 0 
    GROUP BY r.id_rubrique, r.libelle
    Mon problème est que les résultats des counts sont incohérents (apparement multipliés l'un par l'autre) lorsque le premier est différent de 0.
    Pour être clair, au lieu d'obtenir pour une rubrique ayant 4 sous rubriques et 2 blocs soit :
    1 | MonLibellé | 4 | 2
    j'obtiens
    1 | MonLibellé | 8 | 8

    Quelqu'un peut-il m'expliquer comment se fait-ce ? et surtout que faire pour y remédier ?
    Le but étant bien entendu de ne faire qu'une seule requête

    Alors à vot' bon coeur m'sieur dame !
    et Merci d'avance !

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Une jointure crée des lignes ; par exemple si tu as 1 rubrique avec 4 Sous-rubriques, cela va créer 4 lignes, si tu ajoutes une jointure avec les blocs (2 pour cette rubriques), tu vas créer 2 lignes pour chacunes des 4 lignes précédemment créées, soit 8 !
    Une solution proche de la tienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT r.id_rubrique, r.libelle, 
    COUNT(distinct r2.id_rubrique) AS nb_sous_rubriques, COUNT(distinct b.id_bloc) AS nb_blocs 
     FROM web_rubrique r 
     LEFT JOIN web_rubrique r2 ON r.id_rubrique = r2.id_parent 
     LEFT JOIN web_bloc b ON r.id_rubrique = b.id_rubrique  
     WHERE r.id_parent = 0 
    GROUP BY r.id_rubrique, r.libelle
    Une autre solution consisterait à compter les nombres de sous-rubriques et de de blocs dans des sous-requêtes et faire la jointure après, mais cela ne marche pas avec tous les moteurs.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ok, je comprend un peu mieux le fonctionnement de la jointure et d'où provenait mon soucis. Pour les sous-requête effectivement, cela aurait été plus simple pour moi, mais effectivement, sur la version de MySQL du serveur, celles-ci ne sont pas encore possible

    En tout cas le distinct fonctionne et résoud bien mon problème !
    Un grand merci donc pour cette réponse très matinale

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

Discussions similaires

  1. Multiple count et join
    Par levalp dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/06/2010, 15h48
  2. count et join de deux tables
    Par crazyvirus dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/03/2010, 05h52
  3. [9i] Multiple Left Outer Join
    Par An0d dans le forum Oracle
    Réponses: 6
    Dernier message: 13/02/2007, 12h29
  4. [requête] multiple count
    Par mandrake_of_mandregas dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/01/2006, 19h05
  5. Multiple Count
    Par Antichoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2003, 11h19

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