簡體   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