1

亲爱的 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 是一个 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 中完成。一位同事给我的建议之一是使用临时表来编写中间结果,但我不确定我是否看到它是如何实现和/或工作的。此外,如果没有大量循环、子字符串和其他丑陋的东西,我认为它不能轻易完成,但我愿意得到纠正。

我希望我的问题的描述或多或少清楚。我将不胜感激任何见解,想法和提示。

提前感谢您的时间和思想分享,Constantijn Blondel,莱比锡 DE

4

1 回答 1

0

在您的 where 子句中选择一个子查询,它将正常工作。

于 2012-04-10T08:46:55.407 回答