![](/img/trans.png)
[英]How to use concated variable into mysql query inside mysql stored procedure?
[英]How to use query string inside IN statement in MySQL stored procedure
朋友,我有一个存储过程。 哪个输入。 但是输入是查询字符串。 当我在IN语句中执行该字符串时,我什么也没得到。
我的存储过程是:
CREATE DEFINER=`root`@`localhost` PROCEDURE `SampleProcedure`(IN category VARCHAR(255)
IN location VARCHAR(255),
IN classification VARCHAR(255))
BEGIN
SELECT u1.firstname , u1.lastname, u1.avatar , s1.address ,c1.cityName
FROM user u1,serviceprovider s1, city c1
WHERE s1.userId=u1.id
AND c1.cityId=s1.city
AND s1.serviceProviderId
IN
(SELECT DISTINCT serviceprovider_cl AS serviceProviderId FROM db.serviceprovider_classification t1
INNER JOIN
db.locationid t2 ON t1.serviceprovider_cl=t2.serviceprovider_locationId
INNER JOIN
db.serviceprovider_category t3 ON t2.serviceprovider_location
INNER JOIN
db.serviceprovider_category t3 ON t2.serviceprovider_locationId=t3.serviceprovider_category
WHERE
t1.serviceproviderclassification_classification IN (classification)
AND
t2.location_serviceLocation IN (location)
AND
t3.category_serviceProviderCategory IN (category)
);
END
在类别,分类和位置中。 我在字符串中得到另一个查询。 那么执行该字符串还是如何将其转换为查询或如何将字符串用作查询?
谢谢
为此,您可以使用一种称为“ Prepared Statements”的东西,您可以在此处找到更多有关此的信息 ...
因此,这是一个SQL Fiddle ,您可以在其中查看prepared语句的工作方式...
如您所见,在这个简单的存储过程中并没有那么复杂。 基本上有三个步骤可以做到这一点。
首先创建将在准备好的语句中使用的字符串。 您执行此操作以连接查询,并且查询将作为字符串(IN类别VARCHAR(255))进入一个语句。
在我的小提琴中:
SET @myString =
CONCAT('SELECT * FROM t2 WHERE t1_id IN (', category, ')');
那是最难的部分。 比您应该从该字符串中扩展语句
PREPARE statement FROM @myString;
比执行语句结束
EXECUTE statement;
当您调用过程时,您将传递字符串,该字符串将成为语句的一部分:
CALL SimpleProcedure('SELECT id FROM t1 WHERE val1 = "myVal2"');
这就是您应该对问题应用的逻辑。
看起来应该像这样:
CREATE DEFINER=`root`@`localhost` PROCEDURE `SampleProcedure`(IN category VARCHAR(255))
BEGIN
SET @myString =
CONCAT('SELECT u1.firstname , u1.lastname, u1.avatar , s1.address ,c1.cityName
FROM user u1,serviceprovider s1, city c1
WHERE s1.userId=u1.id
AND c1.cityId=s1.city
AND s1.serviceProviderId
IN
(', category,
' INNER JOIN
db.serviceprovider_category t3 ON t2.serviceprovider_locationId=t3.serviceprovider_category
WHERE
t3.category_serviceProviderCategory IN (', category, '))');
PREPARE statement FROM @myString;
EXECUTE statement;
END
编辑:请注意,在'和INNER JOIN之间有一个空格,因为CONCAT如果没有该空格,将连接'category'查询和内部联接的最后一个单词,这将导致您遇到问题,您的查询将无法正常工作!
GL!
PS另外我还注意到,当JOIN表(旧逗号分隔的JOIN和新方法)看起来不太好时,您会混合使用这两种语法,这将是更正此问题并像在子查询中一样使用新的INNER JOIN语法的好方法。 。
新的EDIT (基于问题编辑)
CREATE DEFINER=`root`@`localhost` PROCEDURE `SampleProcedure`(IN category VARCHAR(255)
IN location VARCHAR(255),
IN classification VARCHAR(255))
BEGIN
SET @myString =
CONCAT('SELECT u1.firstname , u1.lastname, u1.avatar , s1.address ,c1.cityName
FROM user u1,serviceprovider s1, city c1
WHERE s1.userId=u1.id
AND c1.cityId=s1.city
AND s1.serviceProviderId
IN
(SELECT DISTINCT serviceprovider_cl AS serviceProviderId FROM db.serviceprovider_classification t1
INNER JOIN
db.locationid t2 ON t1.serviceprovider_cl=t2.serviceprovider_locationId
INNER JOIN
db.serviceprovider_category t3 ON t2.serviceprovider_location
INNER JOIN
db.serviceprovider_category t3 ON t2.serviceprovider_locationId=t3.serviceprovider_category
WHERE
t1.serviceproviderclassification_classification IN (', classification, ')
AND
t2.location_serviceLocation IN (', location, ')
AND
t3.category_serviceProviderCategory IN (', category, '))');
PREPARE statement FROM @myString;
EXECUTE statement;
END
IN
语句中的子查询等于与子查询表的JOIN
。 为什么需要“ exotic”语法而不是简单联接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.