2010-08-16 106 views
3

假设我有一个具有以下结构的表:获取给定ID的根和叶节点 - 如何?

================= 
| Id | ParentId | 
================= 
| 1 | 0  | 
| 2 | 1  | 
| 3 | 1  | 
| 4 | 2  | 
| 5 | 2  | 
| 6 | 3  | 
| 7 | 3  | 
----------------- 

这导致了这样的树:

 1 
    /\ 
    2  3 
/\ /\ 
4 5 6 7 

获得一个ID,我如何得到所有的叶节点?所以,如果给定的id是2,返回应该是4 & 5.给定的id永远不会是叶节点本身。

我不知道这里怎么修改SQL:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

SELECT t1.name FROM 
category AS t1 LEFT JOIN category as t2 
ON t1.category_id = t2.parent 
WHERE t2.category_id IS NULL; 

EDIT1:此外,我如何得到一个给定id根ID?因此,如果给定的ID为2,返回应为1

+0

如果在您的示例中给定的id是1,结果会是什么? – 2010-08-16 01:12:37

+0

不确定。没有? 0? – StackOverflowNewbie 2010-08-16 01:20:38

+0

我真的会建议你实际使用你指出的文章中描述的表结构。从长远来看,你会为自己节省很多挫折。 – mhitza 2010-08-16 02:06:54

回答

1

“还有,我如何才能为给定ID的根ID?所以,如果给定的ID为2,返回应1.”

这很容易,这是ParentId!

你会用下面的查询得到孩子:

SELECT child.Id FROM theTable current LEFT JOIN theTable child ON child.ParentId = current.Id; 

顺便说一句,我不建议使用0当行没有父,我宁愿在这种情况下使用NULL

+0

如何检索所有的子女孩子?不仅是中间的? – 2012-03-16 15:31:38

+0

这不能在单个查询中完成。通过循环递归可以得到所有的子小孩,所以只需要得到所有小孩的所有孩子。 – 2012-03-16 21:26:09