Как использовать 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;