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

MS SQL Server Discussion :

Obtenir un COUNT() = 0 lors d'une jointure ?


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Obtenir un COUNT() = 0 lors d'une jointure ?
    Bonjour,

    Un petit dessin vaut mieux qu'un long discours...

    J'ai deux tables liées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [users]
        [id_user] NOT NULL PRIMARY KEY
        [id_avatar] FOREIGN KEY
        [nom]
     
    [avatars]
        [id_avatar] NOT NULL PRIMARY KEY
        [url] NOT NULL
        [description]
    Avec pour le contenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [users]
    1, 1, "Alice"
    2, 2, "Bob"
    3, 1, "Charlie"
    4, 4, "Diane"
     
    [avatars]
    1, "/quiet.gif", "Je suis calme"
    2, "/sad.gif"  , "Je suis triste"
    3, "/angry.gif", "Je suis en colère"
    4, "/happy.gif", "Je suis heureux"
    Je souhaite obtenir en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    2, "Je suis calme"
    1, "Je suis triste"
    0, "Je suis en colère"
    1, "Je suis heureux"
    Comme première étape, j'arrive à obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Alice"  , "Je suis calme"
    "Bob"    , "Je suis triste"
    "Charlie", "Je suis calme"
    "Diane"  , "Je suis heureux"
    NULL     , "Je suis en colère"
    Avec la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [users].[nom], [avatars].[description]
    FROM [users] RIGHT JOIN [avatars] ON [users].[id_avatar]=[avatars].[id_avatar]
    En revanche, dès que je place mon COUNT(), j'ai le choix entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    2, "Je suis calme"
    1, "Je suis triste"
    1, "Je suis heureux"
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    2, "Je suis calme"
    1, "Je suis triste"
    1, "Je suis en colère" --le 1 est compté pour l'entrée NULL
    1, "Je suis heureux"
    Y a-t-il une solution à ce problème ?

    D'avance merci !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [avatars].[description] , count([avatars].[description])
    FROM [users] LEFT OUTER JOIN [avatars] ON [users].[id_avatar]=[avatars].[id_avatar]
    group by [avatars].[description]

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    (J'ai corrigé ma requête, il s'agissait d'un RIGHT et non d'un LEFT)

    Kagemaru, avec un RIGHT ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "Calme",	2
    "En colère",	1
    "Heureux",	1
    "Triste",	1
    Et avec un LEFT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "Calme",	2
    "Heureux",	1
    "Triste",	1
    En revanche, grâce à toi, j'ai trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [avatars].[description] , count([users].[id_user])
    FROM [users] RIGHT JOIN [avatars]
    ON [users].[id_avatar]=[avatars].[id_avatar]
    GROUP BY [avatars].[description]
    Il suffisait de compter le champ [users].[id_user] et non le champ [avatars].[description].
    Et j'ai compris du même coup à quoi ça servait de mettre autre chose que * dans le COUNT()

    Pour la peine, je met résolu. Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    pour préciser, count(*) ou count(colonne) n'a pas eu d'effet sur ton résultat, c'est le group by surtout je pense ...

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    J'ai fait le test avec un COUNT([avatars].[...]) et un COUNT([users].[...]) et il y a vraiment une différence. Ce qui semble logique, en définitive, puisqu'il y a effectivement 1 résultat dans les avatars, associé à 0 résultats dans les users.

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

Discussions similaires

  1. [ZF 1.11] Redéfinir un nom de champ lors d'une jointure
    Par RunCodePhp dans le forum Zend_Db
    Réponses: 2
    Dernier message: 09/04/2012, 22h21
  2. Somme multipliée par deux lors d'une jointure
    Par JuniorBI dans le forum SQL
    Réponses: 19
    Dernier message: 23/02/2012, 11h20
  3. Problème de correspondances lors d'une jointure (tMap)
    Par cocaaladioxine dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 23/06/2011, 11h11
  4. Cast sur une clé primaire lors d'une jointure
    Par totoranky dans le forum Hibernate
    Réponses: 4
    Dernier message: 08/03/2011, 13h13
  5. Doublons sur le résultat lors d'une jointure de 3 tables
    Par kevinh44fr dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/01/2011, 18h17

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