2016-10-12 10 views
3

をmysqlの文字列を爆発さ:返される値は、コンマでdelimeted文字列ですスプリット/私はのような変数に結果を置く(複雑な)サブクエリ作成した数値で

@mylist := (select ....) 

を..サブクエリではconcat()も使用するため、値は文字列です。

where table.mycolumn IN('575030,655156,655157') 

中:問題は@mylistが文字列であるため、MySQLはとしてクエリを読み込むということです

where table.mycolumn IN (@mylist) 

:私はのような別のサブクエリで、この変数を使用したいと同じSQLで

where table.mycolumn IN(575030,655156,655157) 

文字列を(数値)arに変換するにはどうすればよいですかレイ?

PS:私はあなたが機能FIND_IN_SET(あなたが指定したMySQLバージョンでit is available)を使用することができますmysqlの5.1

答えて

3

を使用しています。これは、自動注入をセパレータとしてカンマを使用して、(変数に保存されている場合)に設けられた文字列を分割し、(見つからない場合0)指定された値の最初の出現の指標の指標を返し

/* building the list */ 
> SELECT @mylist :=GROUP_CONCAT(id SEPARATOR ',') FROM users WHERE id < 10; 
+-----------------------------------------+ 
| @mylist:=group_concat(id separator ',') | 
+-----------------------------------------+ 
| 0,2,3,4,5,6,7,8,9      | 
+-----------------------------------------+ 

> SELECT id, mail FROM users WHERE FIND_IN_SET(id, @mylist); 

ほとんどの場合、元のタイプと最終的な文字列との比較を自動的に管理するのに十分である。


UPDATE

それは、あなたの質問に答えるが、idの膨大な量を探していたときに、提案された解決策は、遅い得ることができます。より良い解決策は、変数の使用を中止し、その結果をテンポラリテーブルに格納することです。

CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
    "id" INT, 
    PRIMARY KEY (id) 
) 

INSERT INTO tmp_users (...); 
+0

@mylistの区切り記号に関係なく、これは機能しますか? – MontyPython

+1

いいえ、ドキュメントによれば、セパレータを変更するパラメータはありません。 'FIND_IN_SET(id、REPLACE(@mylist、 'my_separator'、 '、'))'を追加することは可能ですが、抽出する値にカンマを含めることはできません。 – Batsu

+1

私の問題を解決していただきありがとうございます! :-) – user2022678

関連する問題