我的桌子倾斜为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
答案 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 BY
为superfluous:
如果使用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