如果我在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
。但我不确定它是如何运作的。
答案 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;
答案 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;