以递归方式调用自身的mysql存储过程

Jür*_*ock 6 mysql recursion stored-procedures

我有下表:

id | parent_id | quantity
-------------------------
1  | null      | 5
2  | null      | 3
3  | 2         | 10
4  | 2         | 15
5  | 3         | 2
6  | 5         | 4
7  | 1         | 9
Run Code Online (Sandbox Code Playgroud)

现在我需要一个mysql中的存储过程,它以递归方式调用自身并返回计算出的数量.例如,id 6具有5作为父亲,其中3作为父亲,其中2作为父亲.所以我需要计算4 * 2 * 10 * 3(= 240)作为结果.

我对存储过程相当新,我将来不会经常使用它们,因为我更喜欢在程序代码中使用业务逻辑而不是在数据库中.但在这种情况下,我无法避免它.

也许一个mysql大师(就是你)可以在几秒钟内完成一个工作语句.

Hai*_*vgi 22

它的工作只在mysql版本> = 5

存储过程声明是这样的,

你可以给它一点改进,但​​这工作:

DELIMITER $$

CREATE PROCEDURE calctotal(
   IN number INT,
   OUT total INT
)

BEGIN

   DECLARE parent_ID INT DEFAULT NULL ;
   DECLARE tmptotal INT DEFAULT 0;
   DECLARE tmptotal2 INT DEFAULT 0;

   SELECT parentid   FROM test   WHERE id = number INTO parent_ID;   
   SELECT quantity   FROM test   WHERE id = number INTO tmptotal;     

   IF parent_ID IS NULL
    THEN
    SET total = tmptotal;
   ELSE     
    CALL calctotal(parent_ID, tmptotal2);
    SET total = tmptotal2 * tmptotal;   
   END IF;

END$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

调用就像(设置此变量很重要):

SET @@GLOBAL.max_sp_recursion_depth = 255;
SET @@session.max_sp_recursion_depth = 255; 

CALL calctotal(6, @total);
SELECT @total;
Run Code Online (Sandbox Code Playgroud)


bra*_*ing 6

看一下Mike Hillyer 在MySQL管理分层数据.

它包含有关处理分层数据的完整工作示例.