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 :

COUNT, SUM et jointures


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 57
    Points
    57
    Par défaut COUNT, SUM et jointures
    Bonjour,

    Je me casse un peu la tête sur une requête

    Je voudrais en une seule requête récupérer des stats utilisateurs.

    Imaginons qu'un utilisateur puisse avoir des albums photos, des albums vidéos.

    Chaque table associée possède un view_count et un comment_count.

    Je veux récupérer le nombre d'albums photos, le nombre d'albums vidéos, ainsi que le cumul total du nombre de vues tout confondu et le cumul total du nombre de commentaires tout confondu.

    Admettons les données suivantes :

    user_id = 2
    1 album photo avec 5 vues | 0 com
    3 albums vidéos avec :
    - 15 vues | 2 com
    - 4 vues | 3 com
    - 12 vues | 0 com

    Voici un début de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT u . * , COUNT( DISTINCT pa.id ) AS photoAlbumCount, COUNT( DISTINCT ma.id ) AS movieAlbumCount, (
    SUM( COALESCE( pa.view_count, 0 ) ) + SUM( COALESCE( ma.view_count, 0 ) )
    ) AS viewCount, (
    SUM( COALESCE( pa.comment_count, 0 ) ) + SUM( COALESCE( ma.comment_count, 0 ) )
    ) AS commentCount
    FROM users u
    LEFT JOIN photo_albums pa ON pa.user_id = u.id
    LEFT JOIN movie_albums ma ON ma.user_id = u.id
    WHERE u.id =  2;
    Le pb c'est que comme j'ai 3 albums vidéos, le nombre de vues de l'album photo va être compté 3x et au lieu d'avoir un viewCount égal à 36 (5+15+4+12), j'aurais le viewCount égal à 46 (5+5+5 +15+4+12).

    Je sais pas si c'est possible de remédier à ça via MySQL uniquement

    Des idées ?


    Merci,
    A+ benjamin.

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonjour,

    Vous pouvez utiliser des "tables dérivées", ce sont des sous-requêtes de la clause FROM.

    A tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     SELECT 
       u.id,
       COALESCE(nbPhoto, 0) AS nbPhoto,
       COALESCE(nbMovie, 0) AS nbMovie,
       COALESCE(pho.nbCom, 0) + COALESCE(mov.nbCom, 0) AS commentCount,
       COALESCE(pho.nbView, 0) + COALESCE(mov.nbView, 0) AS viewCount
     FROM users AS u
       LEFT JOIN (
         SELECT 
           user_id, 
           Count(*) AS nbPhoto, 
           SUM(view_count) AS nbCom,
           SUM(comment_count) AS nbView
         FROM photo_albums
         GROUP BY user_id
       ) AS pho
         ON u.id = pho.user_id
       LEFT JOIN (
         SELECT 
           user_id, 
           Count(*) AS nbMovie, 
           SUM(view_count) AS nbCom,
           SUM(comment_count) AS nbView
         FROM movies_albums
         GROUP BY user_id
       ) AS mov
         ON u.id = mov.user_id
    WHERE u.id = 2

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 57
    Points
    57
    Par défaut
    Salut Oishiiii,

    Merci pour ton aide, ta requête m'a bien aidé, je l'a complété pour quelle colle avec ma bdd et j'ai obtenu ce que je voulais.


    A+ benjamin.

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

Discussions similaires

  1. Count Multiple et Jointure
    Par Llaur76 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/05/2008, 15h47
  2. Plusieurs SUM et jointure.
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/09/2007, 15h38
  3. Requete COUNT + SUM
    Par Seth77 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/05/2007, 04h42
  4. COUNT dans une jointure
    Par picsoun dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2006, 20h27
  5. un count sur une jointure et ca ne fonctionne pas
    Par elbronziero dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2004, 11h23

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