MySQL的递归(树)父子类别

我是mysql的新手。这是我的桌子:

类别表:

id | name        | prent

----------------------------

1 | os | null

2 | linux | 1

3 | ubuntu | 2

4 | xubuntu | 3

5 | lubuntu | 3

6 | zubuntu | 3

7 | zubuntu 2 | 6

8 | suse | 2

9 | fedora | 2

10 | windowse | 1

11 | windowse xp | 10

12 | windowse 7 | 10

13 | windowse 8 | 10

14 | food | null

15 | dance | null

每个类别都有一个父项,我想准备它们以显示在下拉菜单中。

这就是我想要得到的:

id | name          | depth

----------------------------

1 | os | 0

2 | -linux | 1

3 | --ubuntu | 2

4 | ---xubuntu | 3

5 | ---lubuntu | 3

6 | ---zubuntu | 3

7 | ----zubuntu 2 | 4

8 | --suse | 2

9 | --fedora | 2

10 | -windows | 1

11 | --windows xp | 2

12 | --windows 7 | 2

13 | --windows 8 | 2

14 | food | 0

15 | dance | 0

在这里,类别没有顺序,我的代码必须为远离父母的孩子类别提供顺序。根据每个类别的父母的深度提供姓名前的缩进。每个类别的孩子数没有限制,但是类别总数不超过100。

有没有查询可以给出这样的结果?我更喜欢可以在PHP框架中以活动记录形式运行的查询。

回答:

这个

带给我。感谢@RolandoMySQLDBA

DELIMITER $$

DROP FUNCTION IF EXISTS `GetAncestry` $$

CREATE FUNCTION `GetAncestry` (GivenID INT) RETURNS VARCHAR(1024)

DETERMINISTIC

BEGIN

DECLARE rv VARCHAR(1024);

DECLARE cm CHAR(1);

DECLARE ch INT;

SET rv = '';

SET cm = '';

SET ch = GivenID;

WHILE ch > 0 DO

SELECT IFNULL(`prent`,-1) INTO ch FROM

(SELECT `prent` FROM Table1 WHERE id = ch) A;

IF ch > 0 THEN

SET rv = CONCAT(rv,cm,ch);

SET cm = ',';

END IF;

END WHILE;

RETURN rv;

END $$

DELIMITER ;

在这里工作的 。

SELECT id,GetAncestry(id) as parents from Table1 where id = 7;

ID PARENTS

7 6,3,2,1

以上是 MySQL的递归(树)父子类别 的全部内容, 来源链接: utcz.com/qa/425426.html

回到顶部