2013-02-20 10 views
5

大きなMySQL SELECTクエリを1つの文字列に変換する必要があるため、2つの独立したクエリを使用せずにUPDATEを行うことができます。簡略化のために、我々はこの結果を返すSELECTクエリを持っていると仮定してみましょう:私は使用することができますMySQL SELECTのすべてを1つの大きな文字列(列と行)に変換

1,Bob,20;2,Adam,30;3,Steve,40; 

:私はこのような何かにそれのすべてを変換するにはどうすればよい

enter image description here

他のテーブルを更新するには?

列と行の数が変わる可能性があり、静的ではないことが分かっています。 (非常に重要!特に列!)。どうすればこの問題を解決できますか?私はCONCAT()がこの状況で助けることができるとは思わない。

ご協力いただければ幸いです。ありがとうございました。

答えて

15

これを試すことができますか?

SELECT group_concat(concat(id, ',', name, ',', age) separator ';') 
FROM test 

http://www.sqlfiddle.com/#!2/915557/9

+1

列が変更される可能性があり、長すぎるため、連結を選択できません。 SELECTクエリからすべての列を自動的に読み取ることができるものが必要です。ありがとうございました。 – Reacen

+0

ああ、申し訳ありません!私は今、他の方法は考えられません。 –

1

このタスクを実行する別のクエリを探していない場合、これはクエリ自体から達成することができ、この

SET @colnames := (SELECT GROUP_CONCAT(COLUMN_NAME, '\', \'') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND TABLE_SCHEMA = 'db'); 
SET @query := CONCAT('SELECT GROUP_CONCAT(', @colnames, 'SEPARATOR \';\') FROM test'); 
PREPARE STMT FROM @query; 
EXECUTE STMT; 
2

を試してみてください。クエリの選択結果に応じて、別のテーブルに挿入してテーブルを更新することもできます。

元の表がtable_fromがあると仮定すると、あなたがtable_to にそれをコピーする必要があり、

がtable_fromからtable_toにコンテンツを挿入するには、(それはさらにtable_fromは、元のデータを上記の含ま言及したと仮定し)

insert into table_to(id, name, age) 
    select tf.id, tf.name, tf.age 
    from table_from tf 
    where tf.id != 3; 

テーブルの列の正確な数を渡す場合は、列名を省略して、大文字と小文字の区別に役立つ値を渡すことができます。

insert into table_to 
    select tf.id, tf.name, tf.age 
    from table_from tf 
    where tf.id != 3; 

はあなたにも.csvファイルを使用することができます

update table_to tt, table_from tf 
    set tt.name = "Chandi" 
    where tt.id = tf.id and tf.id = 1; 

http://www.sqlfiddle.com/#!2/af43a/1

関連する問題