如何在 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。但我不知道它是如何工作的。

334658 次浏览

试试:

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 Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0

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;

您可以在这里看到它的实现: < strong > Sql 小提琴演示 。正是您所需要的。

更新 分两步走。首先,我们得到一个表,其中所有值(逗号分隔)对应唯一的[ Name,id ]。然后,从获得的表中,我们将所有的名称和值作为一个单独的值对应于每个惟一的 id 请看这里解释的 < strong > SQL 小提琴演示 (向下滚动,因为它有两个结果集)

编辑 在阅读问题时有一个错误,我只按 ID 分组。但是如果需要两个 group _ contact (值按 Name 和 id 连接,然后按 id 连接)。先前的回答是

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

您可以在这里看到它的实现: < strong > SQL 小提琴演示

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,为了连接,我使用了 For XML Path (”)语法。 Stuff 函数将一个字符串插入到另一个字符串中,然后删除指定长度的字符 在第一个字符串的开始位置,然后插入第二个字符串到第一个字符串 在起始位置。

STUFF 函数看起来像这样: STUFF (字符表达式,开始,长度,字符表达式)

性格表达式 是字符数据的表达式。 string _ expression 可以是常量、变量或列 字符或二进制数据。

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

长度 指定要删除的字符数的整数。如果长度大于第一个字符 _ 表达式, 长度可以是 bigint 类型的最后一个字符。

SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
 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

首先,我不明白为什么 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
SELECT
id,
Group_concat(`column`)
FROM
(SELECT
id,
Concat(`name`, ':', Group_concat(`value`)) AS `column`
FROM mytbl
GROUP  BY id, name) tbl
GROUP BY id;