Я пытаюсь получить список категорий на основе их родительского идентификатора из таблицы SQL. Запрос работает правильно, когда выполняется как обычный запрос, но когда тот же код копируется в хранимую функцию, возвращает повторяющиеся записи.
Мне не удалось получить запрос на возврат нескольких категорий, поэтому я попробовал хранимую функцию, которая, как я понял, может это сделать.
Я исключил весь запрос, но хотел бы иметь возможность вызова из оператора SELECT, т.е.
SELECT field1, field2, get_parent_categories(562) FROM...
Следующее работает как требуется, так как возвращает «65> 562> 1030»
http://sqlfiddle.com/#!9/9fc8acc/3
Следующая - это сохраненная функция, которая не работает, так как возвращает «562> 562> 562 ...», повторенные 256 раз. Тем не менее, я получаю ошибку «Переполнение стека потока» в sqlfiddle при попытке запустить то же самое, что я тестировал локально.
http://sqlfiddle.com/#!9/09a64b/1
CREATE TABLE IF NOT EXISTS `categories` (
`categories_id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`categories_id`)
) DEFAULT CHARSET=utf8//
INSERT INTO `categories` (`categories_id`, `parent_id`) VALUES (1030, 0),(562,65),(65,1030)//
CREATE FUNCTION get_parent_categories(_lookup_category_id INT) RETURNS LONGTEXT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _id INT;
DECLARE _categories LONGTEXT DEFAULT "no categories";
#CREATE TEMPORARY TABLE mycats
SELECT GROUP_CONCAT(c.categories_id SEPARATOR " > ") INTO _categories
FROM (
SELECT
@r AS _id,
(SELECT @r := parent_id FROM categories WHERE categories_id = _id) AS parent_id
FROM
(SELECT @r := _lookup_category_id) vars, categories
WHERE @r <> 0) T1
JOIN categories c ON T1._id = c.categories_id;
RETURN _categories;
END//