【发布时间】: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