我有一个包含以下形式的父子关系的表:
+----+-----------+
| id | nParent |
+----+-----------+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
+----+-----------+
这张表代表了我要抽象的对象之间的树状(多级,n元)关系。应用程序的其余部分已经使用了这个层次结构,并且很容易获得一个或多个父项的子项的父项。但是,我现在正在尝试解决一个问题,我需要一个节点下的子树中的所有元素。在寻找答案时,我发现了一个 amazing solution on DBA Stack Exchange正是为这个要求创建了一个函数。这是经过必要修改后的代码:
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。截断了不正确的 DOUBLE 值“14,15,16”*
我逐部分重写了函数,各个部分(查询等)运行良好。但是在函数中,它会抛出错误。
可能出了什么问题? 我如何才能准确找到导致错误的原因?
最佳答案
您的问题出在这一行:
SET front_id = FORMAT(queue,0);
queue
是逗号分隔的值列表,MySQL 不想将其转换为数值。将此行更改为
SET front_id = cast(substring_index(queue, ',', 1) as unsigned);
解决问题。看这个demo on rextester您可以在其中尝试在两行代码之间进行更改。
关于mysql - 如何理解导致 MySQL Function 中 Truncated incorrect double value 错误的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720302/