MySQL将所有内容都整理成一个大字符串(列和行)

时间:2013-02-20 05:18:16

标签: mysql sql

我有一个很大的MySQL SELECT查询,我需要只转换成一个字符串,所以我可以从中进行UPDATE,而不必使用两个单独的查询。为简单起见,我们假设我们有一个返回此结果的SELECT查询:

enter image description here

如何将所有内容转换为以下内容:

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

我可以用它来更新其他表吗?

知道列数和行数都可以更改并且不是静态的。 (非常重要!特别是列!)。我该如何解决这个问题?我不认为CONCAT()可以在这种情况下提供帮助。

任何帮助将不胜感激。谢谢你。

4 个答案:

答案 0 :(得分:16)

你能试试吗?

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

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

答案 1 :(得分:2)

试试这个

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 :(得分:2)

如果您不是在寻找单独的查询来执行此任务,则可以从查询本身实现。您可以插入另一个表并根据查询选择结果更新表。

假设您的原始表是table_from,您需要将其复制到table_to中 (它进一步假设table_from包含上述原始数据),

将内容从table_from插入table_to,

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;

从table_from更新table_to的内容,

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

答案 3 :(得分:0)

您也可以使用.csv文件。 Micheal McLaughlin对如何做到这一点有一些很好的了解。 http://michaelmclaughlin.info/db1/lesson-7-aggregation/mysql-csv-upload/