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

  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

  7. #7
    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
    Pour le IFNULL, c'est si jamais y'a pas de vote, pour que ça renvoi "0" et pas NULL
    OK, dans ce cas il est plus performant de l'écrire dans l'autre sens :


  8. #8
    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
    Merci pour tes précieuses suggestions & conseils avisés
    Pour les curieux, voici la requête finale :

    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
    SELECT i_id, i_date, i_titre, i_cat, i_type, i_explication, i_contenu, i_tag, i_favori, i_coeur, COUNT(com_type="item") AS i_nbre_commentaire, cat_nom, i_note, i_nbre_vote
     
    FROM (
     
      SELECT i_id, i_date, i_titre, i_cat, i_type, i_explication, i_contenu, i_tag, i_favori, i_coeur, COUNT(v_id) AS i_nbre_vote, IFNULL(SUM(v_note), 0) AS i_note
      FROM`lpdn_item` 
      LEFT JOIN `lpdn_vote` ON v_ref = i_id 
      WHERE v_type = "item" AND i_statut > 0
      GROUP BY i_id, i_titre, i_cat, i_type, i_explication, i_contenu, i_tag, i_favori, i_coeur
     
      ) AS i
     
    LEFT JOIN `lpdn_commentaire` ON com_ref = i.i_id
    LEFT JOIN `lpdn_categorie` ON cat_id = i.i_cat
    GROUP BY i_id, i_titre, i_cat, i_type, i_explication, i_contenu, i_tag, i_favori, i_coeur
    ORDER BY i_date DESC

+ 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