Как использовать GROUP_CONCAT в CONCAT в MySQL

Если у меня есть таблица со следующими данными в 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. Но я не уверен, как это работает.

Ответ 1

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]. Затем из полученной таблицы мы получаем все имена и значения как одно значение для каждого уникального идентификатора. Это объясняется здесь Демонстрация SQL Fiddle (прокрутите вниз, так как она имеет два набора результатов)

Edit При чтении вопроса произошла ошибка, я сгруппировал только по идентификатору. Но два group_contacts необходимы, если (значения должны быть объединены в группы по имени и идентификатору, а затем по всем по идентификатору). Предыдущий ответ был

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

Вы можете увидеть, как это реализовано здесь: SQL Fiddle Demo

Ответ 2

Try:

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

Ответ 3

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

Ответ 4

Прежде всего, я не вижу причины наличия уникального идентификатора, но я думаю, это идентификатор, который соединяется с другой таблицей. Во-вторых, нет необходимости в подзапросах, которые превосходят сервер. Вы делаете это в одном запросе, например

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

Ответ 5

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

вы должны использовать cast или convert, иначе будет возвращен BLOB

результат

id         Column
1          A:4,A:5,B:8
2          C:9

вам придется обрабатывать результат еще раз такой программой, как python или java

Ответ 6

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

Мое имя таблицы является тестом, и для конкатенации я использую синтаксис For XML Path (''). Функция stuff вставляет строку в другую строку. Он удаляет указанную длину символов  в первой строке в стартовой позиции, а затем вставляет вторую строку в первую строку  в начальной позиции.

Функции STUFF выглядят следующим образом: STUFF (character_expression, start, length, character_expression)

character_expression Является выражением символьных данных. character_expression может быть константой, переменной или столбцом символьные или двоичные данные.

начало Является целочисленным значением, указывающим местоположение для начала удаления и вставки. Если начало или длина отрицательны, возвращается нулевая строка. Если начало больше, чем первое выражение character_expression, возвращается пустая строка. start может быть типа bigint.

Длина Является целым числом, определяющим количество символов для удаления. Если длина больше, чем первое выражение character_expression, удаление происходит до последнего символа в последнем символьном выражении. длина может быть типа bigint.

Ответ 7

ВЫБЕРИТЕ идентификатор,      GROUP_CONCAT (column) ОТ (ВЫБЕРИТЕ идентификатор,              Concat (name, ':', Group_concat (value)) AS column       ОТ mytbl       Идентификатор GROUP BY,                 имя) тбл Идентификатор GROUP BY;