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 PostgreSQL Discussion :

Multiple count et join


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut Multiple count et join
    Bonjour,
    J'essaie de faire une requete SQL avec plusieurs count :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.id, nom, prenom, count(b.id) AS nbbreve, count(ni.idutilisateur) AS nbni
    FROM utilisateur_actif u
    JOIN breve b ON u.id=b.idemetteur
    JOIN noteinformation ni ON u.id=ni.idutilisateur
    WHERE u.id=65
    GROUP BY u.id,u.nom,u.prenom
    Je ne sais pas pourquoi, les 2 COUNT me ramènent le produit de ce que je voudrais, et lorsque je mets un DISTINCT dedans, le premier résultat est juste, et le 2e me renvoie 1. (il devrait retourner 179)
    Merci d'avance de m'éclairer.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2010
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    Si j'ai bien compris tu veux savoir combien tes utilisateurs ont produit de brèves et de notes d'information ?
    Essaie de faire tes count dans des sous-requêtes. Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.id, nom, prenom,nbbreve, nbni
    FROM utilisateur_actif u
    JOIN (select idemetteur, count(id) AS nbbreve  FROM breve) b ON u.id=b.idemetteur
    JOIN (select idutilisateur, count(idutilisateur) AS nbni FROM noteinformation) ni ON u.id=ni.idutilisateur
    WHERE u.id=65
    GROUP BY u.id,u.nom,u.prenom
    Par contre il y a un truc bizarre : une foie tu comptes les id de ta table breves donc le nombre de brèves des émetteurs et une fois tu comptes les utilisateurs dans la table noteinformation donc le nbre d'utilsateurs qui ont produit des note d'information.
    Est-ce que c'est bien ça que tu veux faire ?
    Est-ce que tu ne veux pas plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.id, nom, prenom,nbbreve, nbni
    FROM utilisateur_actif u
    JOIN (select idemetteur, count(id) AS nbbreve  FROM breve) b ON u.id=b.idemetteur
    JOIN (select idutilisateur, count(id) AS nbni FROM noteinformation) ni ON u.id=ni.idutilisateur
    WHERE u.id=65
    GROUP BY u.id,u.nom,u.prenom

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut
    merci beaucoup gilgil
    Effectivement, c'est bien le nombre de brève et le nombre de notes d'information envoyé par chaque utilisateur que je veux.
    J'ai essayé ta requête, et j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERREUR:  la colonne « breve.idemetteur » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
    cette erreur persiste en mettant breve.idemetteur dans la clause GROUP BY.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2010
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    oui j'ai oublié le group by dans les sous requêtes, il est indispensable car tu fais un count qui est une fonction d'aggrégat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.id, nom, prenom,nbbreve, nbni
    FROM utilisateur_actif u
    JOIN (SELECT idemetteur, count(id) AS nbbreve  FROM breve GROUP BY idemetteur) b ON u.id=b.idemetteur
    JOIN (SELECT idutilisateur, count(id) AS nbni FROM noteinformation GROUP BY idutilisateur) ni ON u.id=ni.idutilisateur
    WHERE u.id=65
    GROUP BY u.id,u.nom,u.prenom

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut
    J'ai dû rajouter b.nbbreve,ni.nbni dans le GROUP BY. Voilà la requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.id, nom, prenom,nbbreve, nbni
    FROM utilisateur_actif u
    LEFT JOIN (SELECT idemetteur, count(id) AS nbbreve  FROM breve GROUP BY idemetteur) b ON u.id=b.idemetteur
    LEFT JOIN (SELECT idutilisateur, count(id) AS nbni FROM noteinformation GROUP BY idutilisateur) ni ON u.id=ni.idutilisateur
    GROUP BY u.id,u.nom,u.prenom,b.nbbreve,ni.nbni
    ORDER BY id ASC
    Merci encore Gilgil.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Deux remarques:

    1) le fait d'utiliser des jointures entre breve et noteinformation fait que si l'utilisateur a produit des brèves mais pas de note d'information (ou réciproquement) alors son nombre de brèves ne pourra pas être compté, ce qui parait problématique. A mon avis il ne faut pas joindre à ce niveau là.

    2) pourquoi faire un group by sur u.id alors que u.id est limité à une seule valeur du fait de clause WHERE?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2010
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    1/ je ne vois pas de jointure entre les brèves et les notes d'information, les 2 JOIN sont sur la table utilisateurs u

    2/ tu as raison, ça devrais fonctionner sans le group by

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut
    Merci pour vos remarques.
    Dans ma dernière requête, j'ai enlevé la limitation de u.id à une seule valeur, d'où le group by sur u.id.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2010
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    même si as retiré le where (pour limiter à un seul utilisateur), vu que tu fais un count (aggregation), tu ne devrais avoir qu'un enregistrement par utilisateur, même sans le group by.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut
    pourtant, si j'enlève u.id du GROUP BY, j'ai l'erreur suivante :
    ERREUR: la colonne « u.id » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    C'est que c'est tout le GROUP BY qu'il faudrait enlever, pas juste une colonne. On utilise GROUP BY quand on veut transformer plusieurs lignes en une seule, sur la base d'une ou plusieurs colonnes qui ont des valeurs identiques entre ces lignes.
    Ici ça ne semble pas être le cas, car chaque ligne va sortir avec un u.id différent.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Points : 45
    Points
    45
    Par défaut
    Effectivement, en enlevant toute la clause GROUP BY, ça fonctionne. Je récapitule la requête qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT u.id, nom, prenom,nbbreve, nbni
    FROM utilisateur_actif u
    LEFT JOIN (SELECT idemetteur, count(id) AS nbbreve  FROM breve GROUP BY idemetteur) b ON u.id=b.idemetteur
    LEFT JOIN (SELECT idutilisateur, count(id) AS nbni FROM noteinformation GROUP BY idutilisateur) ni ON u.id=ni.idutilisateur
    ORDER BY id ASC
    Merci à tous.

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

Discussions similaires

  1. count et join de deux tables
    Par crazyvirus dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/03/2010, 05h52
  2. [9i] Multiple Left Outer Join
    Par An0d dans le forum Oracle
    Réponses: 6
    Dernier message: 13/02/2007, 12h29
  3. [requête] multiple count
    Par mandrake_of_mandregas dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/01/2006, 19h05
  4. multiples COUNT et JOIN
    Par Ryle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2004, 08h26
  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