Problème affichage zero count(*) et group by

mtardieu Messages postés 15 Date d'inscription lundi 2 juillet 2012 Statut Membre Dernière intervention 3 juillet 2012 - 2 juil. 2012 à 15:40
PunKeel Messages postés 43 Date d'inscription lundi 3 octobre 2011 Statut Membre Dernière intervention 26 février 2014 - 3 juil. 2012 à 11:39
Bonjour,

J'ai une base de données, où il y a plusieurs équipes, plusieurs produits, et d'autres champs non nécessaires pour le problème. Je ne possède qu'une table qui s'appelle article_database.

Dans cet exemple, j'ai 3 équipes : AB1 AB2 et PNE, ainsi que 4 produits : AeRE, AeTM, ARD, CMT.
J'aimerais connaitre le nombre d'article, pour chaque produit et pour chaque équipe. J'effectue donc cette requête mysql :

SELECT 'Team' , 'Product' , COUNT(*) AS nb_article FROM 'article_database'WHERE 'Team'IN ('AB1','AB2','PNE') AND 'Product'IN ('AeRE', 'AeTM','ARD','CMT')
GROUP BY 'Team' , 'Product'



J'ai ce tableau qui est généré :

Team----- Product -- nb_ptr
AB1------- AeRE ----- 362
AB1------- AeTM ----- 569
AB1------- CMT ------ 6
AB2------- AeRE ----- 90
AB2------- AeTM ----- 55
AB2------- ARD ------ 20
AB2------- CMT ------ 4
PNE------- AeRE ----- 34
PNE------- AeRE ----- 51

Comme vous pouvez le voir, l'équipe AB1 a 0 article ARD. L'équipe AB2 possède des articles de chaque produit et l'équipe PNE ne possède pas d'article ARD et CMT.
Mais le group by permet que de sélectionner des champs non nuls.
Or, j'ai besoin absolument de rajouter les lignes qu'il manque avec des 0, afin d'obtenir ceci :

Team----- Product -- nb_ptr
AB1------- AeRE ----- 362
AB1------- AeTM ----- 569
AB1------- ARD ------ 0
AB1------- CMT ------ 6
AB2------- AeRE ----- 90
AB2------- AeTM ----- 55
AB2------- ARD ------ 20
AB2------- CMT ------ 4
PNE------- AeRE ----- 34
PNE------- AeRE ----- 51
PNE------- ARD ------ 0
PNE------- CMT ------ 0

J'aimerais savoir si quelqu'un a une syntaxe précise de mysql qui peut faire en sorte d'afficher des 0 afin de compléter mon tableau.

Merci d'avance !
A voir également:

3 réponses

PunKeel Messages postés 43 Date d'inscription lundi 3 octobre 2011 Statut Membre Dernière intervention 26 février 2014
2 juil. 2012 à 19:37
PNE------- AeRE ----- 34
PNE------- AeRE ----- 51

->
PNE------- AeRE ----- 34
PNE------- AeTM ----- 51


Petits liens vers un problème "similaire" (pour pas dire le même ..)
http://stackoverflow.com/questions/3597577/return-count-0-with-mysql-group-by
http://explainextended.com/2010/01/30/aggregates-subqueries-vs-group-by/
http://stackoverflow.com/questions/3855678/mysql-include-zero-rows-when-using-count-with-group-by
Français :
http://www.generation-nt.com/reponses/mysql-completer-group-by-avec-valeurs-0-entraide-3762851.html



D'ailleurs, ton group by est inutile si tu fais un "foreach" en PHP qui prend where team xxx and product xxx
Suffit de faire pareil en sql ... Dur :/
0
mtardieu Messages postés 15 Date d'inscription lundi 2 juillet 2012 Statut Membre Dernière intervention 3 juillet 2012
3 juil. 2012 à 09:50
Merci de tes infos mais j'ai déjà malheureusement passé plus de 5heures sur des forums à chercher le même problème que moi, et j'ai déjà vu tous les posts que tu as mis. Seul problème : je n'ai qu'une seule table, et toutes les solutions apportées consistent à faire un LEFT JOIN, et nécessitent une deuxième table. Donc ce n'est pas du tout le même problème =)

Je ne vois pas comment le group by est inutile, dans la mesure où le foreach demanderait de faire 2 boucles, une sur la team et une sur le produit, et donc je pense un temps de calcul plus important. (Pour la requête sql, je ne vois pas comment faire pareil ^^)

Sinon j'ai trouvé une autre solution, en fait je créer à partir de mon tableau généré l'autre tableau en faisant comme ceci :

$row = 0
boucle for $k++ sur les team
{
boucle for $m++ sur les product
{
si colonne0 de ma ligne $row égale à team $k et si colonne1 de ma ligne $row égale au product $m alors
j'affiche colonne2
sinon j'affiche 0
$row++
}
}
0
PunKeel Messages postés 43 Date d'inscription lundi 3 octobre 2011 Statut Membre Dernière intervention 26 février 2014
3 juil. 2012 à 11:39
Par foreach, j'entendais ta solution en bas du topic :)


Au pire, tu peux faire un array_intersec ou je ne sais quoi en PHP avec les valeurs nulles, par défaut ... Non ? :)
0
Rejoignez-nous