首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql查询:如何使没有孩子的标签成为父母?

sql查询:如何使没有孩子的标签成为父母?
EN

Stack Overflow用户
提问于 2011-08-04 12:08:50
回答 4查看 133关注 0票数 0

我有张标签桌,

代码语言:javascript
复制
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

我想要返回这样的结果,

代码语言:javascript
复制
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

到目前为止,我提出的这个问题,

代码语言:javascript
复制
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

但不幸的是,它只会像这样返回结果,

代码语言:javascript
复制
ParentID    ParentName  TotalChildren
3           Tagname-1   2
5           tagname-2   2
6           tagname-3   1
9           tagname-4   1

这意味着它失去了没有孩子的父母。

如果没有孩子,我怎么才能成为父母呢?换句话说,如何在没有父母的情况下制作标签,使其成为父母自己?

编辑:

代码语言:javascript
复制
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
ORDER BY ParentID

上面的答案回来了,

代码语言:javascript
复制
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

这是不正确的,因为它返回所有的孩子。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-04 12:18:12

更喜欢针对子查询的联接:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-08-04 12:11:25

你快到了..。只需要使连接成为一个外部的:

编辑:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-08-04 12:10:53

我在这里并不完全理解您的需求,但我要说,如果您将内部联接更改为左联接,并将b.TotalChildren更改为IF(b.TotalChildren is null, 0, b.TotalChildren),那么您将得到所需的结果集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6941145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档