MySQL 在存储过程中使用 WHERE IN ()

MySQL Using WHERE IN () in STORED PROCEDURE

我在两个 table 之间建立了多对多关系(事件和集合)。

我正在构建一个 PHP 应用程序并希望创建一个存储过程,该存储过程采用一个或多个集合名称和 returns table 作为集合一部分的事件.

这个有效

使用硬编码集合名称的测试有效,但显然不是我想要的。

DROP PROCEDURE `test`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `name` VARCHAR(255) CHARSET utf8) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN
    SELECT e.name, e.start, e.end, e.description, c.name AS collection FROM events AS e
    INNER JOIN events_collections AS ec
    ON e.id = ec.event_id
    INNER JOIN collections AS c
    ON c.id = ec.collection_id
    WHERE c.name IN ('Inventors', 'Philosophers');
END

我试过的

我四处搜索并找到了这些:
how to use WHERE IN mysql stored procedure
https://www.tutorialspoint.com/working-with-where-in-in-a-mysql-stored-procedure

在我的例子中,这将转换为以下代码:

DROP PROCEDURE `get_collection`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_collection`(IN `coll_name` VARCHAR(255) CHARSET utf8) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN

    SET @Query = CONCAT('SELECT e.name, e.start, e.end, e.description, c.name AS collection FROM events AS e
    INNER JOIN events_collections AS ec
    ON e.id = ec.event_id
    INNER JOIN collections AS c
    ON c.id = ec.collection_id
    WHERE c.name IN (',`coll_name`,')');
    PREPARE stmt FROM @Query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

调用过程时...

CALL get_collection('Inventors, Philosophers')

...它 returns 一个错误

#1054 - Unknown column 'Inventors' in 'where clause'

我不明白哪里出了问题,非常感谢您提供一些意见。

您需要引用字符串变量,例如:

CALL get_collection("'Inventors', 'Philosophers'");