亲爱的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);
函数PREG_REPLACE是来自[http://www.mysqludf.org/lib_mysqludf_preg/]的UDF,这是人们一直在寻找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中严格完成。同事给我的一个建议是使用临时表来编写中间结果,但我不确定我是否看到它是如何实现和/或工作的。而且,如果没有很多循环,子串和其他丑陋的话,我认为不能轻易完成,但我有待纠正。我希望对我的问题的描述或多或少是清楚的。我很欣赏任何见解,想法和提示。
提前感谢您的时间和精神,Constantijn Blondel,Leipzig DE
答案 0 :(得分:0)
在你的where子句中选择一个可以正常工作的子查询。