2009-09-11 4 views
0

J'ai une requête répertoriant les catégories de produits, par supercatégorie> catégorie. La requête compte le nombre de produits dans chaque catégorie (COUNT(ptc.catid)).SQL: COUNT() avec des éléments apparaissant plusieurs fois dans une relation un-à-plusieurs? Alternative à GROUP BY?

Cependant, la requête ne laisse pas apparaître une catégorie deux fois (une catégorie peut être liée à plusieurs supercatégories). Comment cela peut-il être réécrit afin que les catégories (c.title) puissent être listées sous plusieurs supercatégories?

SELECT 
    s.supercategory_id, 
      s.title, 
      c.title, 
      c.id, 
      COUNT(ptc.catid) 

FROM supercategories s, 
    supercategories_to_categories stc, 
    categories c, 
    products p, 
    products_categories ptc 

WHERE c.viewable='1' 

AND c.id=stc.category_id 
AND stc.supercategory_id=s.supercategory_id 
AND ptc.catid=c.id 
AND ptc.productid = p.id 
AND p.viewable='y' 

GROUP BY ptc.catid 
ORDER BY s.title, c.title 

Merci!

+0

à première vue, la requête ne semble pas avoir raison. toutes les colonnes de non-agrégation doivent être sous GROUP BY. –

Répondre

1

La syntaxe de jointure que vous utilisez est un peu « old school », donc si ça ne te dérange pas que je vais le réécrire ici:

select 
    s.supercategory_id, 
    max(s.title) as supercategory_title, 
    max(c.title) as category_title, 
    c.id, 
    count(ptc.catid) as product_count 

from supercategories s 

join supercategories_to_categories stc on stc.supercategory_id = s.supercategory_id 
join categories c on c.id = stc.category_id 
join products_to_categories ptc on ptc.catid = c.id 
join products p on p.id = ptc.productid 

where p.viewable = 'y' 

group by s.supercategory_id, c.id 

Comme le montre, je l'ai changé l'expression group by pour inclure supercategory_id, ce qui permet à une catégorie d'apparaître une fois par super catégorie dont elle est membre. J'ai également ajouté des fonctions d'agrégation autour des colonnes non-group-by, car je ne suis pas sûr de savoir comment cela aurait été exécuté auparavant.

+0

+1 Mais vous avez manqué 'c.viewable =''' –

0

Essayez de changer GROUP BY à:

GROUP BY ptc.catid, stc.supercategory_id