如何在MySQL的CONCAT中使用GROUP_CONCAT

时间:2012-11-19 10:10:09

标签: 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。但我不确定它是如何运作的。

7 个答案:

答案 0 :(得分:134)

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 Fiddle Demo(向下滚动,因为它有两个结果集)

编辑阅读问题时出错,我只按ID分组。但是如果(值要按名称和ID分组,然后按ID分组,则需要两个group_contacts)。 以前的回答是

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

您可以在此处看到它:SQL Fiddle Demo

答案 1 :(得分:21)

尝试:

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

答案 2 :(得分:8)

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

答案 3 :(得分:4)

首先,我没有看到ID不是唯一的原因,但我猜这是一个连接到另一个表的ID。 其次,不需要子查询,这会击败服务器。您可以在一个查询中执行此操作,例如

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

您可以获得快速且正确的结果,并且可以通过SEPARATOR“|”拆分结果。我总是使用这个分隔符,因为它不可能在字符串中找到它,因此它是独一无二的。 有两个A没有问题,你只识别值。或者你可以再写一个字母,这个字母甚至更好。 像这样:

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

答案 4 :(得分:2)

 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等程序处理结果

答案 5 :(得分:0)

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

我的表名是test,对于concatination,我使用For XML Path('')语法。 stuff函数将字符串插入另一个字符串。它删除指定长度的字符  在起始位置的第一个字符串中,然后将第二个字符串插入第一个字符串  在起始位置。

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

一个character_expression 是字符数据的表达。 character_expression可以是常量,变量或列 字符或二进制数据。

开始 是一个整数值,指定开始删除和插入的位置。如果开始或长度为负, 返回一个空字符串。如果start比第一个character_expression长,则返回空字符串。 start可以是bigint类型。

长度 是一个整数,指定要删除的字符数。如果length比第一个character_expression长, 删除发生在最后一个character_expression中的最后一个字符。长度可以是bigint类型。

答案 6 :(得分:0)

SELECT ID,        Group_concat(column) 从(选择ID,                Concat(name,':',Group_concat(value))AS column         来自mytbl         按ID分组,                   名称)tbl GROUP BY ID;