![](/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.