我有一个表,其中包含以下形式的子-父关系:
+----+-----------+
| id | nParent |
+----+-----------+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
+----+-----------+
此表表示我要抽象的对象之间的树(多级,n元)关系。应用程序的其余部分已经使用了这个层次结构,很容易获得子级的父级或父级的子级。不过,我现在正试图解决一个问题,在这个问题中,我需要一个节点下的子树中的所有元素。在寻找答案的过程中,我在dba堆栈交换上发现了一个惊人的解决方案,它创建了一个正好满足这个需求的函数。以下是经过必要修改后的代码:
CREATE FUNCTION `GetFamilyTree`(GivenID INT) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE rv,q,queue,queue_children VARCHAR(1024);
DECLARE queue_length,front_id,pos INT;
SET rv = '';
SET queue = GivenID;
SET queue_length = 1;
WHILE queue_length > 0 DO
SET front_id = FORMAT(queue,0);
IF queue_length = 1 THEN
SET queue = '';
ELSE
SET pos = LOCATE(',',queue) +1 ;
SET q = SUBSTR(queue,pos);
SET queue = q;
END IF;
SET queue_length = queue_length - 1;
SELECT IFNULL(qc,'') INTO queue_children
FROM (SELECT GROUP_CONCAT(id) qc
FROM nodes WHERE nParent = front_id) A;
IF LENGTH(queue_children) = 0 THEN
IF LENGTH(queue) = 0 THEN
SET queue_length = 0;
END IF;
ELSE
IF LENGTH(rv) = 0 THEN
SET rv = queue_children;
ELSE
SET rv = CONCAT(rv,',',queue_children);
END IF;
IF LENGTH(queue) = 0 THEN
SET queue = queue_children;
ELSE
SET queue = CONCAT(queue,',',queue_children);
END IF;
SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
END IF;
END WHILE;
RETURN rv;
END
但是,当我运行它时,我得到一个错误,错误代码是:1292。截断了不正确的双精度值“14,15,16”*
我一部分一部分地重写了函数,各个部分(查询等)都很好地工作。但在函数中,它抛出错误。
有什么问题吗?我怎样才能准确地找到导致错误的原因?
1条答案
按热度按时间eni9jsuy1#
你的问题是:
SET front_id = cast(substring_index(queue, ',', 1) as unsigned);