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 :

Compter les fils indirects d'une table


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 121
    Points : 110
    Points
    110
    Par défaut Compter les fils indirects d'une table
    Bonjour,

    J'ai la situation suivante :

    3 table : GrandParent 1àplusieurs Parent 1àplusieurs et Fils

    Je veux une requête qui retourne pour chaque GrandParent la somme de ses fils, et 0 si aucun fils ou bien aucun parent.

    merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    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 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Quelle requête as-tu commencé à écrire et où pèche-t-elle ?
    Quel SGBD utilises-tu ?
    Quelle est la structure de tes tables ?

    Règles du forum Langage SQL à lire par tous

  3. #3
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    En essayant de deviner la structure, je dirais :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT grandparent.nom, count(fils.idFils)
    FROM grandparent,parent,fils
    WHERE grandparent.idgrandparent=parent.idgrandparent
    AND parent.idparent = fils.idparent
    GROUP BY grandparent.nom

    Mais je crois que le schéma est faux et mal fait. Déjà une relation réflexive serait beaucoup mieux pour modéliser ce genre de chose.
    Puis ça n'est pas une relation un à plusieur qui relie grandparent à parent, ni parent à fils...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    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 103
    Points : 28 394
    Points
    28 394
    Par défaut
    La requête d'ilys05 n'est pas loin du résultat mais, faute de jointure externe, ne retournera aucune ligne si un GrandParent n'a pas de Parent ou pas de Fils.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  gpt.nom
        ,   COUNT(fls.idfils)
    FROM    grandparent AS gpt
        LEFT JOIN
            parent      AS prt
            ON  gpt.idgrandparent = prt.idgrandparent
        LEFT JOIN
            fils        AS fls
            ON  prt.idparent = fls.idparent
    GROUP BY gpt.nom
    Par ailleurs une relation réflexive n'a pas grand intérêt lorsque la profondeur de la hiérarchie est aussi faible et connue à l'avance.

    PS : Depuis de nombreuses années déjà, les jointures utilisent le mot clé JOIN et ne s'écrivent plus comme un produit cartésien assorti d'une restriction.

  5. #5
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    La requête d'ilys05 n'est pas loin du résultat mais, faute de jointure externe, ne retournera aucune ligne si un GrandParent n'a pas de Parent ou pas de Fils.
    c'est vrai.
    Citation Envoyé par al1_24 Voir le message
    Par ailleurs une relation réflexive n'a pas grand intérêt lorsque la profondeur de la hiérarchie est aussi faible et connue à l'avance.
    Oui, mais là c'est faux. La relation qui existe entre parent et fils n'est pas 1 à plusieurs. Un fils possède deux parents.
    Citation Envoyé par al1_24 Voir le message
    PS : Depuis de nombreuses années déjà, les jointures utilisent le mot clé JOIN et ne s'écrivent plus comme un produit cartésien assorti d'une restriction.
    .
    Je me suis toujours habitué à utilisé les WHERE sur les clés primaires/étrangères, que je ne me suis jamais intéressé au mot clé JOIN. Question d'habitude seulement.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par ilys05 Voir le message
    Je me suis toujours habitué à utilisé les WHERE sur les clés primaires/étrangères, que je ne me suis jamais intéressé au mot clé JOIN. Question d'habitude seulement.
    Non ce n'est pas qu'une question d'habitude. Si l'utilisation des jointures dans le WHERE est relativement similaire dans le cas des jointures fortes, elle est extrêmement simplifiée lors des jointures externes.

    De plus, ce forum étant consacré au SQL tel que défini par la norme (même s'il y a des écarts en fonction de l'implémentation de cette dernière selon les différents SGBD), quand on peut s'y tenir, on s'y tient !

  7. #7
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Totalement d'accord. Je ne ferais plus que du LEFT JOIN chef .

  8. #8
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 121
    Points : 110
    Points
    110
    Par défaut
    Merci beaucoup pour vos réponses

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/03/2012, 16h49
  2. [MySQL] Compter les lignes "NULL" d'une table
    Par Budy123 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/03/2010, 12h05
  3. Réponses: 6
    Dernier message: 11/11/2009, 17h14
  4. Réponses: 4
    Dernier message: 05/09/2008, 11h03
  5. Compter les differents element d'une table
    Par FlyByck dans le forum SQL
    Réponses: 1
    Dernier message: 10/12/2007, 09h17

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