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 sur multiple jointure


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut COUNT sur multiple jointure
    Bonjour,
    J'utilise actuellement cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT `lpdn_item`.`i_id`, `lpdn_item`.`i_type`, `lpdn_item`.`i_titre`, `lpdn_item`.`i_date`, `lpdn_item`.`i_explication`, `lpdn_item`.`i_coeur`, `lpdn_item`.`i_statut`, SUM(IFNULL(v_note,0)) AS `i_note`, COUNT(v_note) AS `i_nbre_vote`, COUNT(com_message) AS `i_nbre_commentaire`, `lpdn_categorie`.`cat_nom` AS `i_cat` 
    FROM `lpdn_item` 
    LEFT JOIN `lpdn_vote` ON v_ref = i_id 
    LEFT JOIN `lpdn_commentaire` ON com_ref = i_id 
    LEFT JOIN `lpdn_categorie` ON i_cat = cat_id 
    WHERE (i_statut > 0) 
    GROUP BY `i_id`, `i_type`, `i_titre`, `i_date`, `i_explication`, `i_coeur`, `i_statut` 
    ORDER BY `i_date` DESC
    Elle est censé récupéré une liste d'article (contenu dans lpdn_item), le nombre de commentaire associé à chaque article, le nombre de vote pour chaque article (vote +1 ou -1), ainsi que la somme des votes, comprendre : la note finale.

    Le problème est que le COUNT des commentaires et des votes ne fonctionne pas (cela renvoi un chiffre qui n'a pas de sens, le COUNT ne correspond à rien), je ne sais pas trop comment faire :/

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    En supposant que tu as une clé com_id sur ta table des commentaire, il faut utiliser COUNT(DISTINCT com_id).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Ca marche effectivement pour le nombre de commentaires, ainsi que le nombre de vote, cependant la somme ne fonctionne toujours pas :/

    Requête actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT `lpdn_item`.`i_id`, `lpdn_item`.`i_type`, `lpdn_item`.`i_titre`, `lpdn_item`.`i_date`, `lpdn_item`.`i_explication`, `lpdn_item`.`i_coeur`, `lpdn_item`.`i_statut`, SUM(IFNULL(v_note,0)) AS `i_note`, COUNT(DISTINCT v_id) AS `i_nbre_vote`, COUNT(DISTINCT com_id) AS `i_nbre_commentaire`, `lpdn_categorie`.`cat_nom` AS `i_cat` 
    FROM `lpdn_item` 
    LEFT JOIN `lpdn_vote` ON v_ref = i_id 
    LEFT JOIN `lpdn_commentaire` ON com_ref = i_id 
    LEFT JOIN `lpdn_categorie` ON i_cat = cat_id 
    WHERE i_statut > 0 AND v_type = "item"
    GROUP BY `i_id`, `i_type`, `i_titre`, `i_date`, `i_explication`, `i_coeur`, `i_statut` 
    ORDER BY `i_date` DESC
    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    J'ai observé que la somme ne se fait mal que lorsqu'il y a des commentaires. Personne ne peut m'aider ? Je sèche complet...

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par Feng-Huang Voir le message
    J'ai observé que la somme ne se fait mal que lorsqu'il y a des commentaires. Personne ne peut m'aider ? Je sèche complet...
    Le problème avec ton schéma de jointure actuel, c'est que si un item a trois commentaires et quatre votes, le jeu des combinatoires te renverra douze lignes ! Pour les COUNT, on s'en sort grâce au DISTINCT, mais pour la somme, ça revient à multiplier les notes par le nombre de commentaires...

    Tu as donc deux solutions :

    1/ en mode bidouille, tu redresses en divisant, et ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(v_note) / COUNT(DISTINCT com_id) AS `i_note`
    (au passage, ton IFNULL ne sert à rien, car les fonctions d'agrégations comme SUM ignorent les NULLs).

    2/ en mode propre, tu imbriques tes requêtes, par exemple sur le mode suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ...
    FROM (
      SELECT i_id, ..., SUM(v_note) AS i_note
      FROM`lpdn_item` 
        LEFT JOIN `lpdn_vote` ON v_ref = i_id 
      GROUP BY lpdn_item.i_id
      ) AS i
      LEFT JOIN `lpdn_commentaire` ON com_ref = i.i_id
    Et du coup, tu devrais pouvoir te passer des DISTINCT et autres bidouilles.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Ok merci je vais étudier ça.

    Pour le IFNULL, c'est si jamais y'a pas de vote, pour que ça renvoi "0" et pas NULL

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

Discussions similaires

  1. [SQL] Count sur jointure
    Par oim dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/01/2008, 16h18
  2. Regrouper les champs sur une jointure multiple
    Par Grégory PLANCHAT dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/09/2007, 12h16
  3. [MySQL 4.1] Count sur jointure avec null
    Par Arnard dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/07/2007, 09h38
  4. 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
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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