У меня есть таблица, которая содержит дочерние и родительские отношения в следующей форме:
+----+-----------+
| id | nParent |
+----+-----------+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
+----+-----------+
Эта таблица представляет собой древовидную (многоуровневую, n-арную) связь между объектами, которые я хочу абстрагировать.Остальная часть приложения уже использует эту иерархию, и очень легко получить родительский дочерний элемент или дочерний элемент родительского элемента.Однако сейчас я пытаюсь решить проблему, в которой мне нужны все элементы поддерева под узлом.При поиске ответов я обнаружил удивительное решение для 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 '*
Я переписал функцию по частям, и отдельные сегменты (запросы и т. Д.) Работают хорошо.Но в функции выдает ошибку.
Что может быть не так?Как я могу найти именно то, что вызывает ошибку?