2011-08-04 54 views
2

我有这样的查询来获得的第一个结果,我从这个post较早想,sql查询:如何让父母没有孩子?

SELECT parents.tag_id AS ParentID, 
     parents.tag_name AS ParentName, 
     COUNT(childs.tag_id) AS TotalChildren 
FROM root_tags AS parents 
    LEFT OUTER JOIN root_tags AS childs 
     ON parents.tag_id = childs.parent_id 
WHERE parents.parent_id IS NULL 
GROUP BY parents.tag_id, parents.tag_name 
ORDER BY parents.tag_id 

它返回,

ParentID ParentName TotalChildren 
3   Tagname-1 2 
5   tagname-2 2 
6   tagname-3 1 
9   tagname-4 1 
18   tagname-10 0 
24   tagname-13 0 
26   tagname-14 0 
28   tagname-15 0 

但我现在还有一个问题,我想回到那个有父母不是孩子可言,

ParentID ParentName TotalChildren 
18   tagname-10 0 
24   tagname-13 0 
26   tagname-14 0 
28   tagname-15 0 

所以我试图使查询到这个,

SELECT 
    parents.tag_id AS ParentID, 
    parents.tag_name AS ParentName, 
    COUNT(childs.tag_id) AS TotalChildren 

FROM root_tags AS parents 
    LEFT OUTER JOIN root_tags AS childs 
    ON parents.tag_id = childs.parent_id 

WHERE parents.parent_id IS NULL 
AND COUNT(childs.tag_id) = '0' 
GROUP BY parents.tag_id, parents.tag_name 
ORDER BY parents.tag_id 

但它返回一个错误#1111 - Invalid use of group function

我怎样才能解决呢?

回答

2

只需添加一个HAVING子句你原来的查询:

SELECT parents.tag_id AS ParentID, 
     parents.tag_name AS ParentName, 
     COUNT(childs.tag_id) AS TotalChildren 
FROM root_tags AS parents 
    LEFT OUTER JOIN root_tags AS childs 
     ON parents.tag_id = childs.parent_id 
WHERE parents.parent_id IS NULL 
GROUP BY parents.tag_id, parents.tag_name 
HAVING COUNT(childs.tag_id) = 0 
ORDER BY parents.tag_id 

你的问题是,你试图用WHERE子句聚集和功能(COUNT)。但是您应该使用WHERE在聚合之前过滤数据HAVING用于聚合后的过滤结果

+0

明白了!谢谢! – laukok

1

更改这一部分

AND COUNT(childs.tag_id) = '0' 
GROUP BY parents.tag_id, parents.tag_name 

GROUP BY parents.tag_id, parents.tag_name 
HAVING COUNT(childs.tag_id) = 0 
+0

明白了!谢谢! – laukok