我是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