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 :

Renvoyer les count = 0 dans un select..pas résolu en fait :(


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Renvoyer les count = 0 dans un select..pas résolu en fait :(
    bonjour a tous,

    Pour construire un menu de navigation hierarchique, j'ai besoin de construire une liste présentant le nombre de sous niveaux de chaque noeud.

    Ma base type (sous oracle 8)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID ----- PARENT ---- LABEL
    1   ----- 0          ---- TOP
    2   ----- 1          ---- Menu1
    3   ----- 1          ---- Menu2
    4   ----- 3          ---- Menu 2.1
    5   ----- 3          ---- Menu 2.2
    4   ----- 1          ---- Menu 3
    je fais alors cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(distinct id) from menus where parent in 
    ( select id from menus where parent_id = 1 ) 
    group by parent
    Résultat : 2
    Sauf que je souhaiterais qu'on me renvoie 0,2,0.

    Par contre quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(distinct id) from menus where parent in 4
    La ca me renvoie bien 0

    Merci a tous ceux qui pourront m'aider sur ce sujet sur lequel je tourne en rond, j'aimerais eviter de faire cela par programmation, en faisant tourner plusieurs requetes séparées.

    Lionel

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Sauf que je souhaiterais qu'on me renvoie 0,2,0
    Le 2 correspond au nombre d'id dont le parent de parent = 1 (le noeud 1 possède 2 sous-niveaux) mais à quoi correspondent respectivement les 0 ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En reprenant tes données, j'obtiens le résultat que je pense que tu attends avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT A.id, A.Label, Count(B.id)
      2  FROM Menu A, Menu B
      3  WHERE A.parent = 1
      4  AND A.id = B.Parent (+)
      5  GROUP BY A.id, A.Label;
     
            ID LABEL                            COUNT(B.ID)
    ---------- -------------------------------- -----------
             2 Menu1                                      0
             3 Menu2                                      2
             6 Menu3                                      0
    Le (+) signifie une jointure externe. C'est une "ancienne" syntaxe que j'ai utilisé car tu es sous Oracle, mais je ne connais pas ta version, et Oracle n'accepte la syntaxe normalisée que depuis la version 9 ...

    Tu trouveras plus d'infos sur les jointures externes dans l'article de SQLPro : http://sql.developpez.com/sqlaz/jointures/#L2.3
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bravo et merci Xo !! Ca fonctionne comme souhaité. Super
    Je retourne m'attaquer a la suite de l'arbre.
    Si je passe sous Oracle 9, quelle syntaxe puis je utiliser a la place du (+)

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par blueman
    Si je passe sous Oracle 9, quelle syntaxe puis je utiliser a la place du (+)
    cf. le lien que je t'ai indiqué dans mon précédent message (cherche LEFT OUTER JOIN)
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    oki cool je vais chercker ça :-)
    j'ai encore une petite question :-$

    La requete en place fonctionne très bien, mais j'ai besoin de la faire évoluer et je n'y arrive pas.

    Fait maintenant je dois afficher uniquement les enfants dont le champ 'visible" vaut 1 et pas 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID ----- PARENT ---- LABEL  ----- VISIBLE
    1   ----- 0          ---- TOP     -----  1
    2   ----- 1          ---- Menu1   ---- 1
    3   ----- 1          ---- Menu2   ---- 1
    4   ----- 3          ---- Menu 2.1 --  1
    5   ----- 3          ---- Menu 2.2 --  0
    4   ----- 1          ---- Menu 3 ----- 0
    J'ai donc modificé la requete de cette façon :

    select A.menu_id, A.menu_lib_fr, A.menu_url, A.menu_order, A.menu_visible, A.menu_language, count(distinct B.menu_id) as counters from menus A, menus B
    where A.menu_visible =1 AND A.menu_parent_id = 34 and A.menu_id = B.menu_parent_id
    (+) Group by A.menu_id , A.menu_lib_fr, A.menu_url, A.menu_order, A.menu_visible, A.menu_language
    order by A.menu_order

    Ce qui marche pour afficher les éléments de premier niveau... mais forcément le compteur de chaque élément prend en compte tous les enfants, meme ceux avec le champ visible à 0 :-(

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

Discussions similaires

  1. [MySQL] problème pour récupérer toutes les lignes contenue dans un select
    Par Baleze dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2012, 20h42
  2. [HTML 4.0] Dans un select : pas de selected par défaut
    Par jlb59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 25/08/2011, 15h22
  3. Réponses: 3
    Dernier message: 04/04/2008, 07h03
  4. Formater les libelles dans un <select>
    Par ranx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 25/08/2005, 13h30
  5. Réponses: 13
    Dernier message: 20/07/2004, 08h54

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