计数树表中的子数

时间:2009-03-07 15:06:53

标签: mysql sql

我的桌子倾斜为tbltre 表结构如下:

`id` int(10) unsigned NOT NULL auto_increment,
`title` longtext NOT NULL, 
`parent` int(10) unsigned default '0'

表的内容是这样的:

 id  Title  parent
.....................
    1   abc    0
    2   xyz    1
    3   pqr    1
    4   uuu    2

所需的结果是 -

 id  title  no of childs
...........................
    1   abc     3
    2   xyz     1
    3   pqr     0
    4   uuu     0

5 个答案:

答案 0 :(得分:2)

这应该可以提供你想要的东西 编辑它没有....看到下面的最后一个编辑:

select 
  parent.id, parent.title, count(child.id) 'number of children' 
from
  ttt parent left join ttt child
    on child.parent = parent.id
group by parent.id
order by parent.id;

mysql的输出:

+----+-------+--------------------+
| id | title | number of children |
+----+-------+--------------------+
|  1 | abc   |                  2 |
|  2 | xyz   |                  1 |
|  3 | pqr   |                  0 |
|  4 | uuu   |                  0 |
+----+-------+--------------------+

编辑:至少在MySQL中,ORDER BYsuperfluous

  

如果使用GROUP BY,则输出行将根据GROUP BY列进行排序,就好像您具有相同列的ORDER BY一样。为了避免GROUP BY生成的排序开销,添加ORDER BY NULL

感谢小费,thomasrutter!

编辑:好吧,thaggie指出我在这里没有仔细阅读这个问题。上面的答案只能得到父母的孩子,而不是所有的后代。正如其他人指出的那样,如果您使用的是Oracle,则可以使用他们的STARTS WTIH/CONNECT BY语法。否则this article可能会引起关注。

答案 1 :(得分:1)

这样的事情怎么样?

SELECT
  a.id,
  a.title,
  COUNT(*) AS children
FROM
  tbltree AS a
  INNER JOIN tbltree AS b ON
    b.parentid=a.id
GROUP BY
  a.id

这只需要一个自连接,你可能希望在GROUP BY语句的tbltree.id上有一个索引(可能你把它作为你的PRIMARY),并且在tbltree.parentid上有一个索引来使这个连接有效。

答案 2 :(得分:0)

如果您使用的是Oracle,我建议使用CONNECT BY,这会使这个问题变得简单。

您可以通过/作为子选择进行分组。

SELECT ID parent_id, TITLE, (
SELECT COUNT(ID) from tbltree group by ID having parent = parent_id) child_count
FROM tbltree;

这是未经测试的,仅适用于树上一层深度。

答案 3 :(得分:0)

我还没有喝咖啡,但你可能想尝试一下

select 
    p.id, p.title, count(c.*) 
  from tbltree as c 
  left join tbltree as p 
  where p.id = c.parent 
  group by p.id
  order by p.id

答案 4 :(得分:0)

希望这能解决你的问题...为我工作

select F.id as Parent, F.Title ,Count(S.ID) as ChildCount 
from tbltree F 
left outer join tbltree S on F.id = S.Parent 
Group BY F.id ,F.Title