Php 如何从递归层次结构、父子关系中找到位置

Php 如何从递归层次结构、父子关系中找到位置,php,mysql,recursion,Php,Mysql,Recursion,我很累得到基于树的结果,哪个id在哪个位置。但没有达到,也看到了许多答案和喜欢 这是我的桌子 CREATE TABLE `memberinfo` ( `id` int(11) NOT NULL auto_increment, `parentid` int(11) NOT NULL default '0', `name` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAU

我很累得到基于树的结果,哪个id在哪个位置。但没有达到,也看到了许多答案和喜欢

这是我的桌子

CREATE TABLE `memberinfo` (
  `id` int(11) NOT NULL auto_increment,
  `parentid` int(11) NOT NULL default '0',
  `name` varchar(250) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


id  parentid name
1     0      abc1
2     1      abc2
3     2      abc3
4     2      abc4
5     0      abc5
6     3      abc6
我希望得到如下职位:

id position
1      1
2      1-1
3      1-1-1
4      1-1-2
5      2
6      1-1-1-1
提前谢谢你的帮助

我尝试使用php递归,但速度太慢,最后出现致命错误(执行超时)

级别查询:

SELECT x.id, x.parentid, x.position, x.name
        FROM 
        (
            SELECT t.id, t.parentid, t.name,@rownum := @rownum + 1 AS position
            FROM memberinfo t
            JOIN (SELECT @rownum := 0) r 
            where t.parentid = '0' order by id
        ) x

我显示了和答案相关的问题,并做了一些小改动,将parentid改为parentid,并将其放入memberinfo表中。 我的it帮助您:

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;
    DECLARE cid INT;
    DECLARE label VARCHAR(24);


    SET rv = '';
    SET cm = '';
    SET ch = GivenID;
    SET cid = 0;
    SET label = '';
    WHILE ch > 0 DO
    SET cid = ch;
        SELECT IFNULL(parent_id,-1) INTO ch FROM
        (SELECT * FROM pctable WHERE id = ch) A;

    SELECT pos INTO label FROM
        (

SELECT x.id, x.parent_id, x.pos
FROM 
(
SELECT t.id, t.parent_id, @rownum := @rownum + 1 AS pos
FROM pctable t
JOIN (SELECT @rownum := 0) r 
where t.parent_id = ch order by id
) x where x.id = cid

    ) P;
        IF ch > 0 THEN
            SET rv = CONCAT(rv,cm,label);
            SET cm = '-';
    else
            SET rv = CONCAT(rv,cm,label);
        END IF;
    END WHILE;
    RETURN rv;
END $$
DELIMITER ;
在这里打电话,就像:

select id,GetAncestry(id) from memberinfo
答案是这样的:

id position
1      1
2      1-1
3      1-1-1
4      1-1-2
5      2
6      1-1-1-1

这有用吗?谢谢@Trent,但仍然没有得到帮助如果你自己没有真正尝试解决这个问题,你在这里不会得到太多帮助。@Trent我已经在php中尝试过递归,但执行超时是致命错误。请查看更新
id position
1      1
2      1-1
3      1-1-1
4      1-1-2
5      2
6      1-1-1-1