MySql 存储过程.... group_concat 中的错误

Posted

技术标签:

【中文标题】MySql 存储过程.... group_concat 中的错误【英文标题】:MySql Stored procedure.... error in group_concat 【发布时间】:2019-07-08 10:43:12 【问题描述】:

我有以下可在 phpMyAdmin 中使用的查询

SELECT CONCAT("'",GROUP_CONCAT( fence_id SEPARATOR "','" ),"'") AS fence_ids 
FROM asset_fence af 
INNER JOIN assets a ON a.vehicle_id = af.vehicle_id 
WHERE a.client_id=1

但是同样的查询在存储过程中给了我错误

错误是:

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 8 行的 '@fence_ids = SELECT CONCAT("'",GROUP_CONCAT(fence_id SEPARATOR "','" ),"'") AS ' 附近使用正确的语法

存储过程是

DELIMITER $$

CREATE PROCEDURE `prcDeleteClient`(IN `f_client_id` INT, OUT AROWS INT)
BEGIN


    START TRANSACTION;


        @fence_ids = SELECT CONCAT("'",GROUP_CONCAT( fence_id SEPARATOR "','" ),"'") AS fence_ids FROM asset_fence af INNER JOIN assets a ON a.vehicle_id = af.vehicle_id WHERE a.client_id=f_client_id


        DELETE
            asset_fence,
            geo_fence

        FROM 
            geo_fence gf INNER JOIN asset_fence af ON gf.fence_id = af.fence_id

        WHERE
            af.fence_id IN (@fence_ids)



        DELETE
            client,
            assets,
            asset_movement

        FROM 
            asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
            assets a INNER JOIN client c ON a.client_id = c.client_id

        WHERE
            c.client_id=f_client_id


        SET @AROWS = ROW_COUNT();
        SELECT @AROWS as AROWS;

    COMMIT;
END $$

DELIMITER ;

更新程序是

DELIMITER $$

CREATE PROCEDURE `prcDeleteClient`(IN `f_client_id` INT, OUT AROWS INT)
BEGIN


    START TRANSACTION;


        DELETE
            af,
            gf
        FROM 
            geo_fence gf

            INNER JOIN asset_fence af ON gf.fence_id = af.fence_id
            INNER JOIN assets a ON a.vehicle_id = af.vehicle_id

        WHERE
            a.client_id=f_client_id;



        DELETE
            c,
            a,
            am

        FROM 
            asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
            assets a INNER JOIN clients c ON a.client_id = c.client_id

        WHERE
            c.client_id=f_client_id;


        SELECT ROW_COUNT() AS AROWS;

    COMMIT;
END $$

DELIMITER ;

错误是:MULTI DELETE 中的未知表 'c'

什么是错误,我该如何纠正?

最好的问候

【问题讨论】:

@juergen d:感谢您的 cmets....如何纠正这个问题?变量有什么问题? 你需要使用SET来分配一个变量。 SET @variable = value; 【参考方案1】:

您正在设置一个值,因此您不需要列别名... 删除AS fence_ids

    SELECT CONCAT("'", GROUP_CONCAT( af.fence_id SEPARATOR "','" ),"'") 
    FROM asset_fence af 
    INNER JOIN assets a ON a.vehicle_id = af.vehicle_id
    WHERE a.client_id=1

你也错过了每次删除的命令终止程序

   DELETE
        asset_fence,
        geo_fence

    FROM 
        geo_fence gf INNER JOIN asset_fence af ON gf.fence_id = af.fence_id

    WHERE
        af.fence_id IN (@fence_ids);



    DELETE
        client,
        assets,
        asset_movement

    FROM 
        asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
        assets a INNER JOIN client c ON a.client_id = c.client_id

    WHERE
        c.client_id=f_client_id;

【讨论】:

感谢您的评论。试过了......同样的错误仍然存​​在【参考方案2】:

首先,你分配变量的语法是错误的,它需要在变量名前加上SET 命令。

其次,如果你想使用SELECT查询的结果作为值,你必须在它周围加上括号:

SET @fence_ids = (SELECT ...);

三、使用时:

WHERE af.fence_id IN (@fence_ids)

它将@fence_ids 视为单个ID,而不是ID 列表。所以这相当于:

WHERE af.fence_id = @fence_ids

如果你想在逗号分隔的列表中搜索某些东西,你需要使用FIND_IN_SET

WHERE FIND_IN_SET(af.fence_id, @fence_ids)

您也不应该在GROUP_CONCAT() 中的值周围添加引号。

但你首先不应该使用GROUP_CONCAT,你应该加入返回所有你想要的ID的查询。

   DELETE
        af,
        gf
    FROM 
        geo_fence gf 
    INNER JOIN asset_fence af ON gf.fence_id = af.fence_id
    INNER JOIN assets a ON a.vehicle_id = af.vehicle_id 
    WHERE a.client_id=f_client_id;

你不需要在两个语句中这样做:

SET @AROWS = ROW_COUNT();
SELECT @AROWS as AROWS;

你可以这样做:

SELECT ROW_COUNT() AS AROWS;

【讨论】:

我会回来的 它显示:MULTI DELETE 中的未知表'asset_fence' 您需要使用别名,而不是完整的表名。 用更新的过程更新了问题......现在错误是错误是:MULTI DELETE 中的未知表'c' 您在INNER JOIN clients c 之前有一个额外的assets a。摆脱它。

以上是关于MySql 存储过程.... group_concat 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程知识点难学吗?

mysql 创建存储过程问题

MYSQL存储过程注释详解

MYSQL存储过程注释详解

mysql中的存储过程怎么使用

mysql 存储过程总结(一)