问:用mysql中的节点获取祖先

时间:2017-05-23 06:57:10

标签: php mysql stored-procedures

以下是我用来创建程序的参考链接:https://dba.stackexchange.com/questions/7147/find-highest-level-of-a-hierarchical-field-with-vs-without-ctes/7161#7161?newreg=88de047579d242c98b8cfe0e17f0330f

程序与该示例配合良好。但不能在我自己的数据库中工作。似乎我在创建程序时做错了什么。 这是我的db的过程:

DELIMITER $$
DROP FUNCTION IF EXISTS `demo`.`GetParentIDByID` $$
CREATE FUNCTION `demo`.`GetParentIDByID` (GivenID INT) RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE rv INT;

    SELECT IFNULL(user_by,-1) INTO rv FROM
    (SELECT user_by FROM users WHERE id = GivenID) A;
    RETURN rv;
END $$
DELIMITER ;

以下过程的SQL查询工作正常。它基本上是获得节点的parent_id:

SELECT id,GetParentIDByID(id) FROM users;

当我试图获得祖先时会出现问题。这是我正在使用的程序:

DELIMITER $$
DROP FUNCTION IF EXISTS `demo`.`GetAncestry` $$
CREATE FUNCTION `demo`.`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(user_by,-1) INTO ch FROM
        (SELECT user_by FROM users WHERE id = ch) A;
        IF ch > 0 THEN
            SET rv = CONCAT(rv,cm,ch);
            SET cm = ',';
        END IF;
    END WHILE;
    RETURN rv;
END $$
DELIMITER ;

SQL查询:

SELECT id,GetAncestry(id) FROM users;

如果我使用此查询,Phpmyadmin卡住了。它永远不会给我任何回报,也不会给我带来错误或成功Stucked

0 个答案:

没有答案