Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/04/2011, 17h58   #1
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 190
Points : 32
Points : 32
Par défaut Count et Group BY

Bonjour à tous,

J'ai les données suivantes dans ma table livre_infos.

Code :
1
2
3
4
5
6
id   livre_id  commentaire
1    1         bien
2    1         bof
3    1         NULL
3    2         NULL
4    3         NULL
J'aimerais afficher le total de résultats trouvés selon la requête suivante:

Code :
1
2
3
4
5
6
SELECT l.id, l.livre_id, COUNT(l.livre_id) AS total, 
l.commentaire AS com,
FROM livre_infos AS l
WHERE l.livre_id =1
AND l.commentaire IS NOT NULL 
GROUP BY l.id
J'obtiens bien les informations souhaitées:

Code :
1
2
3
id   livre_id  commentaire   total
1    1         bien               1 
2    1         bof                1
mais le total retourne 1 (et c'est normal à cause du group by). J'aimerais donc que ca retourne 2, qui est le nombre de résultats trouvés . Avez-vous une idée comment je pourrais corriger ce problème sans passer par mysql_num_rows() ?

Merci
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 19h18   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Tout d'abord ta requête est fausse, chaque colonne sélectionnée et non aggrégée doit faire partie du GROUP BY:
A lire absoluement autour du GROUP BY spécifique de MySql

Et sur MySql, qui ne connaît pas les fonctions analytiques, il faut passer par une sous-requête :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT l1.id, l1.livre_id, l2.total,l1.commentaire AS com
  FROM livre_infos l1
  JOIN (SELECT l.livre_id, count(*) AS total
          FROM livre_infos l
         WHERE l.livre_id = 1
           AND l.commentaire IS NOT NULL
         GROUP BY l.livre_id
       ) l2 
    ON l1.livre_id = l2.livre_id
 WHERE l1.commentaire IS NOT NULL
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 20h17   #3
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 190
Points : 32
Points : 32
Merci pour la réponse mais je trouve que c'est comme même beaucoup de code pour le résultat que je veux obtenir !!!! pourquoi on vérifie si le commentaire n'est pas NULL à 2 reprises ?
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 21h01   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Merci pour la réponse mais je trouve que c'est comme même beaucoup de code pour le résultat que je veux obtenir !!!!
Un SGBD plus performant en SQL permettrait d'écrire :
Code :
1
2
3
4
SELECT l.id, l.livre_id, COUNT(*) over () AS total, l.commentaire AS com
  FROM livre_infos AS l
 WHERE l.livre_id =1
   AND l.commentaire IS NOT NULL
Mais malheureusement tu utilises MySql....
Citation:
pourquoi on vérifie si le commentaire n'est pas NULL à 2 reprises ?
La 1ère fois c'est pour ne pas compter les commentaires NULL, et la 2ème fois c'est pour ne pas afficher les lignes où le commentaire est NULL.
Mais c'est vrai ça n'est pas terrible... comme MySql...
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 21h58   #5
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 190
Points : 32
Points : 32
Ok merci bien, mais le count suggéré précédemment ne règle toujours pas mon problème, car il ne me retourne pas le nombre de ligne trouvées.(équivalent de mysql_num_rows).
Supposons que je veux retourner le nombre de lignes dont les id ont été commentés:

Exemple:

Code :
1
2
3
4
5
6
id   livre_id  commentaire
1    1         bien
2    1         bof
3    1         NULL
4    2         ok
5    3         NULL
avec le code suggérée ca me retourne 2 alors que ca doit me retourner 3 puisqu'il y a trois commentaires!!

Merci
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 22h34   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ah ok, tu souhaites avoir le total de tous les commantaires quelque soit le livre_id :
Code :
1
2
3
4
5
SELECT l.id, l.livre_id, l.commentaire AS com,
       (SELECT COUNT(commentaire) FROM livre_infos) AS total
  FROM livre_infos AS l
 WHERE l.livre_id =1
   AND l.commentaire IS NOT NULL
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h31.


 
 
 
 
Partenaires

Hébergement Web