Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL的CONCAT中使用GROUP_CONCAT_Mysql_Concat_Group Concat - Fatal编程技术网

如何在MySQL的CONCAT中使用GROUP_CONCAT

如何在MySQL的CONCAT中使用GROUP_CONCAT,mysql,concat,group-concat,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。但我不确定它是如何工作的。试试:

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

试试:

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:

您可以在此处看到它的实现:。正是你需要的

更新 分成两步。首先,我们得到一个表,其中所有的valuescomma都与唯一的[Name,id]分隔开。然后,从获得的表中,我们将所有名称和值作为针对每个唯一id的单个值 请参见此处解释的内容向下滚动,因为它有两个结果集

编辑阅读问题时出错,我只按id分组。但如果要将值按名称和id分组,然后按id总体分组,则需要两个group_联系人。之前的答案是

您可以在这里看到它的实现:

如果对象_ID'master..test'不是null Drop table test

我的表名是test,对于concatation,我使用for-XML路径语法。 stuff函数将一个字符串插入到另一个字符串中。它删除指定长度的字符 在起始位置插入第一个字符串,然后将第二个字符串插入第一个字符串 在起始位置

填充函数如下所示:填充字符\表达式、开始、长度、字符\表达式

字符表达式 是字符数据的表达式。字符\表达式可以是常量、变量或任意一个的列 字符或二进制数据

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

SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
长度 是一个整数,指定要删除的字符数。如果长度大于第一个字符_表达式, 删除发生在最后一个字符\u表达式中的最后一个字符之前。长度可以是bigint类型

SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) 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
您可以快速获得正确的结果,并且可以使用分隔符|分割结果。我总是使用这个分隔符,因为在字符串中找不到它,所以它是唯一的。 有两个A没有问题,您只识别值。或者你可以再要一个带字母的柱子,这样更好。 像这样:

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

这并没有满足Biswa的要求。我认为重要的是要提醒人们,只使用一种分隔符可能是不利的。我建议将名称分隔符设为分号,值分隔符可以保留为逗号,还请注意,GROUP_CONCAT可能会自动将其输出截断为GROUP_CONCAT_max_len。设置组\u concat\u max\u len=。。。会有帮助,但检查返回的字节是否正确是个好主意?长度小于group_concat_max_len。请注意,group_concat遇到一个空值,它将忽略包含它的整行。我在第二个警告中解决了这个问题。如果任何人在回答中遇到SQL Fiddle链接的问题。工作小提琴在这里:如果你能在你的答案中添加一些描述就好了。这是一个改进此答案和未来答案的建议。谢谢
id         Column
1          A:4,A:5,B:8
2          C:9
SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
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;