如何在MySQL的CONCAT中使用GROUP_CONCAT

如果我在MySQL中有以下数据表:

id Name Value 1 A 4 1 A 5 1 B 8 2 C 9 

我如何把它变成以下格式?

 id Column 1 A:4,5,B:8 2 C:9 

我想我必须使用GROUP_CONCAT ,但我不知道它是如何工作的。

 select id, group_concat(`Name` separator ',') as `ColumnName` from ( select id, concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name` from mytbl group by id, `Name` ) tbl group by id; 

你可以看到它在这里实现: Sql Fiddle Demo 。 正是你所需要的。

分两步更新分裂。 首先我们得到一个具有所有值(逗号分隔)的唯一的[Name,id]表。 然后从获得的表中,我们得到所有名称和值作为一个单一的值对每个唯一的ID请参阅这里解释SQL小提琴演示 (向下滚动,因为它有两个结果集)

编辑阅读问题时出现错误,我只是通过编号进行分组。 但是,如果两个group_contacts是必需的(值按照名称和id分组,然后通过id分组)。 以前的回答是

 select id,group_concat(concat(`name`,':',`value`) separator ',') as Result from mytbl group by id 

你可以看到它在这里实现: SQL Fiddle演示

尝试:

 CREATE TABLE test ( ID INTEGER, NAME VARCHAR (50), VALUE INTEGER ); INSERT INTO test VALUES (1, 'A', 4); INSERT INTO test VALUES (1, 'A', 5); INSERT INTO test VALUES (1, 'B', 8); INSERT INTO test VALUES (2, 'C', 9); SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',') FROM ( SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME FROM test GROUP BY ID, NAME ) AS A GROUP BY ID; 

SQL小提琴: http ://sqlfiddle.com/#!2/b5abe/9/0

 SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result FROM test GROUP BY ID 

首先,我没有看到有一个不唯一的ID的原因,但我想这是一个ID连接到另一个表。 其次,不需要子查询,它打败了服务器。 你在一个查询中这样做,就像这样

 SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id 

你得到快速和正确的结果,并且你可以通过SEPARATOR“|”分割结果。 我总是使用这个分隔符,因为它不可能在一个string中find它,因此它是唯一的。 有两个A没有问题,你只确定价值。 或者你也可以再来一个这个字,这个字甚至更好。 喜欢这个 :

 SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name 

IF OBJECT_ID('master..test') is not null Drop table test

 CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER ); INSERT INTO test VALUES (1, 'A', 4); INSERT INTO test VALUES (1, 'A', 5); INSERT INTO test VALUES (1, 'B', 8); INSERT INTO test VALUES (2, 'C', 9); select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc 

我的表名是testing,并为concatination我使用的XMLpath(“)”的语法。 stuff函数将string插入到另一个string中。 它会删除开始位置第一个string中的指定长度的字符,然后将第二个string插入到开始位置的第一个string中。

STUFF函数如下所示:STUFF(character_expression,start,length,character_expression)

character_expression是字符数据的expression式。 character_expression可以是字符或二进制数据的常量,variables或列。

start是一个整数值,指定开始删除和插入的位置。 如果start或length是负数,则返回空string。 如果start比第一个character_expression长,则返回空string。 开始可以是typesbigint。

长度是指定要删除的字符数的整数。 如果长度比第一个字符expression式长,则直到最后一个字符expression式中的最后一个字符发生删除。 长度可以是biginttypes。

  SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result FROM test GROUP BY id 

你必须使用强制转换或转换,否则将返回BLOB

结果是

 id Column 1 A:4,A:5,B:8 2 C:9 

你必须通过诸如python或java之类的程序再次处理结果