【发布时间】:2019-07-05 16:40:15
【问题描述】:
我正在尝试根据其父 ID 从 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//
【问题讨论】:
-
您是否在真实服务器上收到此错误?您无法调整 sqlfiddle 上的线程堆栈限制,您应该能够在您的服务器上执行此操作。见stackoverflow.com/questions/8821575/…
-
不,我的本地服务器上没有任何错误,它只是返回 562 > 562 > 562 ..." 重复 256 次而不是 "65 > 562 > 1030"。