2011-11-12 2 views
1

Désolé, je ne pouvais pas penser à un meilleur titre ...Count (*) ne sera pas afficher quand le résultat est 0 lors de l'utilisation par groupe

Je cette base de données où j'ai une table « bibitems » (basicly texts) 'tags' (les balises dans lesquelles le texte est classé) et 'taglinks' (Entité associative entre un bibitem et une balise)

Donc sur ma page je veux afficher chaque tag, directement suivi de la quantité de les documents qui sont déposés sous cette étiquette donc si 2 documents sont sous 'java', il est dit java (2)

SELECT 
    tags.id, 
    naamnl, 
    COUNT(*) AS 'count' 
FROM 
    tags, 
    bibitems, 
    taglinks 
WHERE 
    bibitems.id=taglinks.item_id 
    AND tag_id=tags.id 
GROUP BY 
    naamnl 

Cela fonctionne bien quand il y a des documents classés sous une certaine étiquette. Mais quand il y a un tag inutilisé jusqu'ici, il ne s'affiche pas.

je le veux pour afficher java (0) dans ce cas

+0

Première google frappé: http://lichao.net/eblog/how-to-display-0-in-conditional-group-by -report-in-count-sql-query-200808164.html –

Répondre

2
SELECT tags.id, 
     tags.naamnl, 
     COUNT(bibitems.id) AS 'count' 
    FROM tags 
    LEFT 
OUTER 
    JOIN taglinks 
    ON taglinks.tag_id = tags.id 
    LEFT 
OUTER 
    JOIN bibitems 
    ON bibitems.id = taglinks.item_id 
GROUP 
    BY tags.id, 
     tags.naamnl 
; 

ou

SELECT tags.id, 
     tags.naamnl, 
     (SELECT COUNT(*) 
      FROM bibitems 
      WHERE bibitems.id IN 
       (SELECT taglinks.item_id 
        FROM taglinks 
        WHERE taglinks.tag_id = tags.id 
       ) 
     ) 
    FROM tags 
GROUP 
    BY tags.id, 
     tags.naamnl 
; 

(Faites votre choix.)

+0

Oui, j'ai lu sur COUNT et je pense que vous avez raison. –

1

Lire la différence entre intérieur et extérieur jointures.

SELECT tag.id, naamnl, COUNT(taglink.tag_id) AS 'count' 
FROM tag 
LEFT OUTER JOIN taglink ON taglink.tag_id=tag.id 
LEFT OUTER JOIN bibitem ON bibitem.id=taglink.item_id 
GROUP BY tag.id, naamnl 
+1

Avez-vous testé cela? Parce que je suis assez sûr que le 'COUNT (*)' évaluera à un quand l'OP veut l'évaluer à zéro. N'est-ce pas? – ruakh

+1

La convention de dénomination singulier vs pluriel est basée sur l'opinion et le style personnel. L'une ou l'autre convention est acceptable. – Jason

+0

@ruakh ah, merde, je pense que vous avez raison. –

0

Quelque chose comme thisshould faire. (Il est difficile puisque vous n'avez pas fourni les schémas de table complets.)

SELECT 
    i.naamnl, 
    COALESCE(t.Count, 0)  AS Count 
FROM 
    bibitems i 
LEFT JOIN 
    (
     SELECT 
     tag_id, 
     COUNT(*) AS Count 
     FROM 
     taglinks 
     GROUP BY 
     item_id 
    ) t 
ON 
    t.tag_id = i.tag_id 
Questions connexes