获得儿童类别的家庭树

时间:2015-05-04 09:34:16

标签: mysql sql

我有一张表,其中存储了一个树形结构。家庭结构基本上是

Category > Sub category > sub sub category

此处的父级是parent_id为0的父级。 我需要通过sql获得任何类别的家庭结构。该表看起来像

cat_id | parent_id | name
-------------------------
1      |    0      | a
2      |    0      | b
3      |    1      | c
4      |    2      | d
5      |    3      | e
6      |    4      | f

所以对于4的cat_id,我需要的结果是

c1.cat_id | c.name | c2.cat_id  |  c2.name   | c3.cat_id |   c3.name
2              b        4            d           null          null

所以对于cat_id为6,我需要的结果是

c1.cat_id | c.name | c2.cat_id  |  c2.name   | c3.cat_id |   c3.name
2              b        4            d           6             f

这是我目前使用的代码,它为每个结果提供了多行

SELECT c1.name cat1, c1.cat_id cat1_id,c2.name cat2, c2.cat_id cat2_id ,c3.name cat3, c3.cat_id cat3_id
 FROM ea_category AS c1
  JOIN ea_category AS c2 ON (c2.parent_id = c1.cat_id)
  JOIN ea_category AS c3 ON (c3.parent_id = 0)
where c1.cat_id = 4

我做错了什么

1 个答案:

答案 0 :(得分:1)

创建一个检索父ID的函数

CREATE FUNCTION fn_getparentCatId

   ( id INT ) RETURNS INT
BEGIN 
 DECLARE parent_catid INT; 
 SET parent_catid = (SELECT parent_id FROM categoryTable WHERE cat_id=id);
 RETURN parent_catid;
END

为父类别名称

创建另一个功能
CREATE FUNCTION fn_getCatName

   ( id INT ) RETURNS VARCHAR(10)
BEGIN 
 DECLARE categoryName Varchar(10); 
 SET categoryName  = (SELECT name FROM categoryTable WHERE cat_id=id);
 RETURN categoryName;
END

然后像下面那样使用

SELECT cat_id, name 
       ,fn_getparentCatId(cat_id) , fn_getCatName(fn_getparentCatId(cat_id))
       ,fn_getparentCatId(fn_getparentCatId(cat_id)) , fn_getCatName(fn_getparentCatId(fn_getparentCatId(cat_id)))

FROM categoryTable
WHERE cat_id=6