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 :

Problème de COUNT [MySQL-5.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut Problème de COUNT
    Bonjour,

    J'ai un souci de count relativement simple mais sur lequel je bute depuis un moment sans comprendre pourquoi.

    La structure des tables de ma base est la suivante :

    Table A : PrimaryKeyA, Colonne_A
    Table B : PrimaryKeyB, ForeignKeyA, Colonne_B
    Table C : PrimaryKeyC, ForeignKeyB, Colonne_C
    Table D : PrimaryKeyD, ForeignKeyA (je ne me suis pas trompé, c'est A !), Colonne_D

    Chaque occurence de la table A a 0 ou n liaisons avec les éléments de B
    Chaque occurence de la table B a 0 ou n liaisons avec les éléments de C
    Chaque occurence de la table A a 0 ou n liaisons avec les éléments de D

    Ma requête est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
        Colonne_A,
        count(Colonne_D)
    FROM
        Table_A a LEFT JOIN
        Table_D d on a.PrimaryKeyA = d.PrimaryKeyA LEFT JOIN
        Table_B d on a.PrimaryKeyA = b.PrimaryKeyA LEFT JOIN
        Table_C d on b.PrimaryKeyB = c.PrimaryKeyB
    GROUP BY
        a.PrimaryKeyA
    Je souhaite faire comme ça car je peux avoir des filtres sur les éléments des tables B ou C et des tris sur Colonne_D et je veux pouvoir traiter filtre et tris dans une seule requête plutôt que d'avoir un tableau à filtrer.

    Ma requête est-elle correcte ? En effet, en pratique elle me renvoie - apparemment - le nombres d'élements de D x nombre d'éléments de C x nombre d'éléments de D.

    Si vous avez une piste, je prends !

    Merci de votre aide / conseil...

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
        Colonne_A,
        count(Colonne_D)
    ...
    GROUP BY
        a.PrimaryKeyA
    En toute rigueur, ça devrait plutôt être :
    Soit le contenu des tables suivant :
    Table A : PrimaryKeyA, Colonne_A
    1, A1
    2, A2

    Table B : PrimaryKeyB, ForeignKeyA, Colonne_B
    1, 1, B1
    2, 1, B2
    3, 2, B3

    Table C : PrimaryKeyC, ForeignKeyB, Colonne_C
    1, 1, C1
    2, 3, C2

    Table D : PrimaryKeyD, ForeignKeyA, Colonne_D
    1, 1, D1
    2, 2, D2

    Puisque vous voulez compter Colonne_D, commençons par la jointure entre A et D :
    PrimaryKeyA, Colonne_A, PrimaryKeyD, ForeignKeyA, Colonne_D
    1, A1, 1, 1, D1
    2, A2, 2, 2, D2

    => COUNT(Colonne_D) = 2

    Ajoutons la jointure entre A et B :
    PrimaryKeyA, Colonne_A, PrimaryKeyD, ForeignKeyA, Colonne_D, PrimaryKeyB, ForeignKeyA, Colonne_B
    1, A1, 1, 1, D1, 1, 1, B1
    1, A1, 1, 1, D1, 2, 1, B2
    2, A2, 2, 2, D2, 3, 2, B3

    => COUNT(Colonne_D) = 3
    Par contre, COUNT(DISTINCT Colonne_D) = 2

    Ajoutons la jointure entre B et C :
    PrimaryKeyA, Colonne_A, PrimaryKeyD, ForeignKeyA, Colonne_D, PrimaryKeyB, ForeignKeyA, Colonne_B, PrimaryKeyC, ForeignKeyB, Colonne_C
    1, A1, 1, 1, D1, 1, 1, B1, 1, 1, C1
    1, A1, 1, 1, D1, 2, 1, B2, NULL, NULL, NULL
    2, A2, 2, 2, D2, 3, 2, B3, 2, 3, C2

    => COUNT(Colonne_D) = 3
    Par contre, COUNT(DISTINCT Colonne_D) = 2

    Conclusion : Ce qu'il vous faut est un COUNT(DISTINCT Colonne_D)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Avec un peut de retard, merci beaucoup ! :-)

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

Discussions similaires

  1. Problème de count dans jointure
    Par metfan dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/08/2007, 09h58
  2. Problème avec COUNT() et la récupération des valeurs..
    Par Marshall_Mathers dans le forum Outils
    Réponses: 4
    Dernier message: 25/06/2007, 12h26
  3. Problème de count
    Par Mat_DZ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2006, 16h18
  4. Problème avec COUNT
    Par LhIaScZkTer dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/01/2006, 02h16
  5. Access/SQL : Problème avec Count
    Par Taurëndil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2005, 15h49

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