繁体   English   中英

如何在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

在类别,分类和位置中。 我在字符串中得到另一个查询。 那么执行该字符串还是如何将其转换为查询或如何将字符串用作查询?
谢谢

为此,您可以使用一种称为“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM