【问题标题】:MySQL stored function does not return same results when ran - retrieving parent id'sMySQL存储函数在运行时不返回相同的结果-检索父ID
【发布时间】: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"。

标签: mysql stored-functions


【解决方案1】:

列的别名 (_id) 和局部变量 (_id) 可能是原因。

试试:

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

dbfiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多