如何在 MySQL 存储过程中的 IN 语句中使用查询字符串

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

In category, classification and location. I'm getting another query in String. So to execute that string or How to convert it into query or how to use string as Query?
Thanks

为此你可以使用一种叫做准备好的语句的东西,你可以找到更多关于它的信息here...

所以这是一个SQL Fiddle,您可以在其中查看准备好的语句是如何工作的...

正如您在这个简单的存储过程中看到的那样,它并没有那么复杂。基本上有三个步骤可以做到这一点。

首先创建将在准备语句中使用的字符串。您这样做是为了将您的查询和您将作为字符串(IN 类别 VARCHAR(255))获得的查询连接到一条语句中。

在我的 Fiddle:

SET @myString = 
       CONCAT('SELECT * FROM t2 WHERE t1_id IN (', category, ')');

这是最难的部分。比你应该从那个字符串

中perapare声明
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 之间有一个空白 space,因为没有它,CONCAT 会连接来自 'category' 查询和内部联接的最后一个词,这将导致您出现问题,并且您的查询无法正常工作!

GL!

P.S。我还注意到你在 JOIN table 时混合了两种语法(旧逗号分隔 JOIN 和新方法)看起来不太好,最好纠正它并使用新的 INNER JOIN 语法,就像你在你的子中所做的那样查询...

新编辑(基于问题编辑)

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 和子查询的 table。为什么需要 "exotic" 语法而不是简单的连接。