2011-08-04 41 views
0

我有這樣的標籤表,sql查詢:如何讓沒有孩子的標籤成爲父母?

tag_id tag_name parent_id cat_id 
3  Tagname-1 NULL  NULL  
5  tagname-2 NULL  NULL  
6  tagname-3 NULL  NULL 
9  tagname-4 NULL  NULL 
11  tagname-5 3   NULL 
13  tagname-6 3   NULL 
15  tagname-8 5   NULL 
17  tagname-9 5   NULL 
18  tagname-10 NULL  NULL 
20  tagname-11 6   NULL 
22  tagname-12 9   NULL 
24  tagname-13 NULL  NULL 
26  tagname-14 NULL  NULL 
28  tagname-15 NULL  NULL 

我想回到這樣的結果,

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 

所以在這裏我有這麼遠出來的查詢,

SELECT 
a.tag_id as ParentID, 
a.tag_name as ParentName, 
b.TotalChildren 

FROM root_tags a INNER JOIN 
(
    SELECT parent_id, COUNT(1) as TotalChildren 
    FROM root_tags 
    WHERE parent_id <> tag_id 
    GROUP BY parent_id 
) b 

ON a.tag_id = b.parent_id 
ORDER BY ParentID 

但不幸的是,它只返回像這樣的結果,

ParentID ParentName TotalChildren 
3   Tagname-1 2 
5   tagname-2 2 
6   tagname-3 1 
9   tagname-4 1 

這意味着它缺少沒有任何孩子的父母。

如何讓沒有孩子的標籤也成爲父母?或換句話說,如何讓沒有父母的標籤自己成爲父母?

編輯:

以上的回報答案,

ParentID ParentName TotalChildren 
3   Tagname-1 2 
5   tagname-2 2 
6   tagname-3 1 
9   tagname-4 1 
11   tagname-5 NULL 
13   tagname-6 NULL 
15   tagname-8 NULL 
17   tagname-9 NULL 
18   tagname-10 NULL 
20   tagname-11 NULL 
22   tagname-12 NULL 
24   tagname-13 NULL 
26   tagname-14 NULL 
28   tagname-15 NULL 

這是不正確的,它返回所有的孩子。

回答

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 
GROUP BY parents.tag_id, parents.tag_name 
ORDER BY parents.tag_id 
+0

明白了!非常感謝! :-) – laukok

0

我並不完全理解你的要求,但我會說,如果你將內連接改爲左連接並且b.TotalChildren改爲IF(b.TotalChildren is null, 0, b.TotalChildren)那麼你會得到你想要的結果集。

1

你就要成功了..只是需要讓加盟外一個:

編輯:

SELECT 
a.tag_id as ParentID, 
a.tag_name as ParentName, 
b.TotalChildren 

FROM root_tags a LEFT OUTER JOIN 
(
    SELECT parent_id, COUNT(1) as TotalChildren 
    FROM root_tags 
    WHERE parent_id <> tag_id 
    GROUP BY parent_id 
) b 

ON a.tag_id = b.parent_id 
WHERE b.TotalChildren is not null 
ORDER BY ParentID 
+0

謝謝,但它沒有正確返回,請看看我上面的編輯。謝謝。 – laukok

+0

哎呀,忘了過濾出來..嘗試編輯版本 – StevieG

0
SELECT 
a.tag_id as ParentID, 
a.tag_name as ParentName, 
count(b.child) as TotalChildren 
FROM root_tags as a INNER JOIN 
(
    SELECT parent_id as child FROM root_tags 
    WHERE parent_id is not NULL 
) as b 
ON a.tag_id = b.child 
where a.parent_id is NULL 
ORDER BY ParentID 
+0

謝謝,但它會返回一個錯誤#1054 - 'on子句'中的未知列'b.parent_id'... – laukok

+0

id應該是b.child在ON部分加入。我已經改變了它 –

+0

感謝ITWorkarounds! :-) – laukok