【问题标题】:prepare statement to pass comma-separated values to stored procedure parameter准备语句以将逗号分隔的值传递给存储过程参数
【发布时间】:2014-08-26 14:42:43
【问题描述】:

我无法将查询移动到存储过程中。对于两个 IN 子句,我需要将逗号分隔的字符串传递给参数 yr_model_no。我已经阅读了一些线程并决定使用准备语句。原始查询可以很好地获取多行,但是在存储过程中,当我使用 call load_things('1283943kd9,2e9kk389334','53') 调用它时(第一个是型号列表,第二个是用户 ID),它只能从逗号分隔字符串的第一个值。起初,我认为这是yr_model_no 参数的长度问题,但将其更改为varchar(200) 会在'where 子句'错误中给我未知列2e9kk389334。有人可以帮我弄清楚以下代码中的准备语句或参数有什么问题吗?

这是我的表架构和查询的similar fiddle example

DELIMITER ;;
CREATE PROCEDURE `load_things` (IN `yr_model_no` varchar(20), IN `yr_app_id` int(5))
BEGIN
    SET @s = 

CONCAT('
SELECT * FROM 
(
   SELECT COUNT( c.app_id ) AS users_no, ROUND( AVG( c.min ) , 1 ) AS avg_min, ROUND( AVG( c.max ) , 1 ) AS avg_max, a.mid, a.likes, a.dislikes, b.model_no
        FROM  `like` a
        RIGHT JOIN  `model` b ON a.mid = b.mid
        LEFT JOIN  `details` c ON c.mid = b.mid
        WHERE b.model_no IN (',yr_model_no,')
        GROUP BY b.model_no
)TAB1
JOIN
(
   SELECT a.app_id,b.model_no,IFNULL(c.isbooked,0) AS isbooked,d.min,d.max,e.like_type
     FROM `users` a
     JOIN `model` b
       ON b.model_no IN (',yr_model_no,')
LEFT JOIN `favorite` c 
       ON c.app_id = a.id
      AND c.mid = b.mid         
LEFT JOIN `details` d 
       ON d.app_id = a.id
      AND d.mid = b.mid 
LEFT JOIN `users_likes` e
       ON e.app_id = a.id
      AND e.mid = b.mid
    WHERE a.id = ',yr_app_id,'
)TAB2
ON TAB1.model_no = TAB2.model_no');

PREPARE stmt from @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt3;
END;;
DELIMITER ;

【问题讨论】:

    标签: mysql sql database stored-procedures


    【解决方案1】:

    如果您考虑一下您的语句生成的 SQL,它将如下所示

    JOIN `model` b
    ON b.model_no IN (1283943kd9,2e9kk389334)
    

    这是无效的 SQL(您需要在 varchar 值周围加上引号)

    您需要确保在传递给过程的字符串中的每个值周围添加引号:

    load_things('''1283943kd9'',''2e9kk389334''','53')
    

    不确定这是否是在 MySQL 中转义字符串的正确方法(您可能需要查看文档)

    这将导致:

    JOIN `model` b
    ON b.model_no IN ('1283943kd9','2e9kk389334')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 2016-02-07
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多