2011-08-04 52 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