单表子查询

4

好的,我有一个表格

Tasks
--
TaskId  (unique autoinc primary)
ChildOf   (Contains task ID of parent, or 0 if top tier (no parent))

我需要编写一个查询,选择所有ChildOf = 0的记录... 简单吧?
好的,但还需要在结果中返回另一列,告诉我们每个任务有多少个子任务...
所以结果会像这样...
TaskID ...  ChildOf ... countChildren
 37   ......  0   ....    3
 42   ......  0   ....    0
 99   ......  0   ....    1 

etc.... 

我知道我需要的两个查询大致是这样的,但需要以某种方式将它们合并起来...

Select TaskId as ParentTaskId, ChildOf from Tasks where ChildOf = 0

并且。
Select count(TaskId) from Tasks where ChildOf = ParentTaskId

注意:这里只有两个层级,即父级和子级,没有孙级!因此希望这样能让事情变得更简单一些。

非常感谢您的帮助。感谢迄今为止提供的所有帮助!


MySQL缺乏现在ANSI标准的递归功能。MySQL网站曾经有一篇关于如何处理MySQL中分层数据的好文章,但是Oracle似乎已经将其删除 :/ - OMG Ponies
但是只有在需要获取多个子级别时,他才需要递归功能。否则,这只是一个简单的子查询。那么Brian,你只需要立即节点的计数,还是要计算整个树(子代的子代)的计数? - Clockwork-Muse
很好的问题... 我只需要一层.. 父级 -> 子级,没有孙子。 - Brian Patterson
2个回答

2
像这样应该可以:
SELECT TaskId as ParentTaskId, ChildOf , 
 (SELECT count(t2.TaskId) 
  FROM Tasks t2
  WHERE t2.ChildOf = t.TaskId) as CountChildren
FROM Tasks t 
WHERE t.ChildOf = 0

0

试试这个:

SELECT T1.TaskID, T1.ChildOf, count(*) from 
  Tasks as T1 join Tasks as T2 on T1.TaskID = T2.ChildOf 
  WHERE T1.ChildOf = 0 
    GROUP BY (T1.TaskID)

这很接近,但没有找出那些没有孩子的父母。 - Brian Patterson
不要使用JOIN,而要使用LEFT JOIN来获取没有子项的父项。 - Carlos Torres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接