如何在MySQL的CONCAT中使用GROUP_CONCAT

Bis*_*swa 102 mysql concat group-concat

如果我在MySQL中有一个包含以下数据的表:

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9
Run Code Online (Sandbox Code Playgroud)

如何将其变为以下格式?

id         Column
1          A:4,5,B:8
2          C:9
Run Code Online (Sandbox Code Playgroud)


我想我必须使用GROUP_CONCAT.但我不确定它是如何工作的.

Sam*_*ami 143

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;
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到它实现: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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢萨米这是我要求的@biswa (4认同)
  • 还请注意,`GROUP_CONCAT`可能会默默地将其输出截断为`group_concat_max_len`.`SET group_concat_max_len = ...`会有所帮助,但无论如何检查返回的(byte?)长度是否小于`group_concat_max_len`是个好主意. (4认同)
  • 我认为重要的是警告人们只使用一种分离器可能是不利的.我建议将"name"分隔符设为分号(;),值分隔符可以保留为逗号(,) (2认同)
  • 另请注意,group_concat遇到单个NULL值,它将省略包含它的整个行.我在第二个警告[这里](/sf/answers/3595843541/)解决这个问题. (2认同)

eis*_*erg 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;
Run Code Online (Sandbox Code Playgroud)

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

  • 是的艾斯伯格+1.你的答案非常准确,而且更早.我第一次回答时犯了一个错误 (2认同)

Joh*_*ohn 8

SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

  • 如果您可以在答案中添加一些描述,那就太好了.这是一个改善这个和未来答案的建议.谢谢! (7认同)

Luc*_*nea 6

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

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
Run Code Online (Sandbox Code Playgroud)

你得到快速和正确的结果,你可以用分隔符“|”分割结果。我总是使用这个分隔符,因为不可能在字符串中找到它,因此它是唯一的。有两个 A 没有问题,您只需确定值。或者,您可以多列一个带有字母的列,这样更好。像这样 :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

结果是

id         Column
1          A:4,A:5,B:8
2          C:9
Run Code Online (Sandbox Code Playgroud)

你必须通过Python或Java等程序再次处理结果