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 )ます。この文字列のフォーマットは常に同じですが、値の数は異なる場合があります。

正規表現のトリックを使用して、この文字列から実際の値を取得できます

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 関数を探しているときはいつでも一般的に推奨されるものです。PREG_REPLACECONVERT()は読み取り可能な文字列ではなく、ブロブを返すため、そこにあります。

これらのクエリを実行した後、

SELECT @IDs;

(この例では) のような値のリストが表示されます153, 211, 226

WHERE ... IN問題は、これらの値を句で使用するように MySQL を説得するにはどうすればよいかということです。単純なクエリ

SELECT * FROM `table` WHERE id IN  ( SELECT @IDs );   

そのように不平を言うことはありませんが、リストの最初の値の結果のみを返し、他の値を無視します(認めざるを得ませんが、なぜそれを行うのか本当に理解していません)。

明らかに、Ruby、Python、Perl などでこれを行うのは簡単ですが、技術的な理由から、SQL で厳密に行う必要があります。同僚が私にくれた提案の 1 つは、一時テーブルを使用して中間結果を書き込むことですが、それがどのように実装および/または機能するかがわかりません。さらに、多くのループ、部分文字列、およびその他の醜さがなければ簡単に実行できるとは思いませんが、修正する必要があります。

私の問題の説明が多かれ少なかれ明確であることを願っています。洞察、アイデア、ヒントをいただければ幸いです。

あなたの時間とマインドシェアを前もって感謝します, Constantijn Blondel, ライプツィヒ DE

4

1 に答える 1

0

where句でサブクエリを選択すると問題なく動作します。

于 2012-04-10T08:46:55.407 に答える