[英]MySQL: Using a string in a "WHERE <column_name> IN <values>" Query
亲爱的 Stackoverflow 会员,
我希望我没有忽略一些明显的东西,但到目前为止我还没有找到解决问题的方法。
我需要使用标准WHERE... IN ( 1, 2, 3, 4 )
子句从表中获取某些列值。 然而,问题是 WHERE 子句中的值必须动态构建,基于存储在另一个表的列中的值,类似于'a:3:{i:0;s:3:"153";i:1;s:3:"211";i:2;s:3:"226";}'
。 在此示例中,要提取的值是 153、211 和 226,这导致子句WHERE <column> IN ( 153, 211, 226 )
。 此字符串的格式始终相同,但值的数量可能会有所不同。
我可以从这个字符串中获取实际值,使用一些 RegExp 技巧
SELECT value from `column` WHERE <non-scary WHERE clause> INTO @valueString;
SET @IDs = CONVERT(PREG_REPLACE('/[^\"]+\"([^\"]+)\".*/', '$1', PREG_REPLACE( '/\"\;[^\"]+\"/', '\,\ ', @valueString )) USING UTF8);
function PREG_REPLACE 是一个 UDF,来自 [http://www.mysqludf.org/lib_mysqludf_preg/],这是人们在寻找 RegExp/Replace 函数时普遍推荐的一个。 CONVERT()
在那里,因为 PREG_REPLACE 给我返回一个 blob,而不是一个可读的字符串。
运行这些查询后,运行
SELECT @IDs;
给我一个值列表,看起来像(在这个例子中) 153, 211, 226
。
现在的问题是,我如何说服 MySQL 在WHERE... IN
子句中使用这些值。 天真的查询
SELECT * FROM `table` WHERE id IN ( SELECT @IDs );
不会这样抱怨,而只会返回列表中第一个值的结果,而忽略其他值(我不得不承认,我真的不明白它为什么这样做)。
很明显,这在 Ruby、Python、Perl 等中都是微不足道的,但出于技术原因,必须严格在 SQL 中完成。一位同事给我的建议之一是使用临时表, 来写中间结果,但我不确定我是否看到它是如何实现和/或工作的。 此外,我不认为如果没有很多循环、substring 东西和其他丑陋的东西,它就不会轻易完成,但我会得到纠正。
我希望我的问题的描述或多或少是清楚的。 我将不胜感激任何见解、想法和提示。
提前感谢您的时间和思想共享,Constantijn Blondel,Leipzig DE
Select 您的 where 子句中的子查询可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.