Сохраненная функция MySQL не возвращает те же результаты при запуске - получение идентификаторов родителей - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь получить список категорий на основе их родительского идентификатора из таблицы 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//

1 Ответ

0 голосов
/ 05 июля 2019

Причиной может быть псевдоним столбца (_id) и локальной переменной (_id).

Попытка:

...
CREATE FUNCTION get_parent_categories(_lookup_category_id INT) RETURNS LONGTEXT
...
  -- DECLARE _id INT;
...

См. dbfiddle .

...