一尘不染

MySQL IN语句的PDO绑定值[重复]

mysql

这个问题已经在这里有了答案

我可以将数组绑定到IN()条件吗? (21个回答)

2个月前关闭。

我对PDO有一个问题,在困扰了一段时间后,我真的很想得到答案。

举个例子:

我将ID数组绑定到PDO语句,以便在MySQL IN语句中使用。

该数组将说: $ values = array(1,2,3,4,5,6,7,8);

数据库安全变量为 $ products = implode(’,’$ values);

因此, $ products 将是一个 STRING ,其值为: ‘1,2,3,4,5,6,7,8’

该语句如下所示:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (:products)

当然, $ products 将被绑定为 :products

但是,在编译该语句并绑定值时,它实际上看起来像这样:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN ('1,2,3,4,5,6,7,8')

问题是它正在将IN语句中的所有内容作为单个字符串执行,因为我已经将其准备为逗号分隔的值以绑定到该语句。

我真正需要的是:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (1,2,3,4,5,6,7,8)

我真正做到这一点的唯一方法是将值放置在字符串本身内而不绑定它们,但是我知道一定有一种更简单的方法可以做到这一点。


阅读 276

收藏
2020-05-17

共1个答案

一尘不染

这与在此问题中提出的问题是一样的:
我可以将数组绑定到IN()条件吗?

答案是,对于in子句中的可变大小列表,您需要自己构造查询。

但是,
您可以使用带引号的逗号分隔列表,使用find_in_set,尽管对于大型数据集,这将对性能产生重大影响,因为表中的每个值都必须转换为char类型。

例如:

select users.id
from users
join products
on products.user_id = users.id
where find_in_set(cast(products.id as char), :products)

或者,作为第三个选项,
您可以创建一个用户定义的函数,该函数可以为您拆分以逗号分隔的列表(请参阅http://www.slickdev.com/2008/09/15/mysql-
query-real-values- from-delimiter-separated-string-ids
/)。这可能是这三个中的最佳选择,尤其是如果您有很多依赖in(...)子句的查询时。

2020-05-17