Ответы:
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 . Именно то, что вам нужно.
Обновление разбиения в два этапа. Сначала мы получаем таблицу, в которой все значения (разделенные запятыми) соответствуют уникальному [Имя, идентификатор]. Затем из полученной таблицы мы получаем все имена и значения как одно значение для каждого уникального идентификатора. См. Это объяснено здесь. SQL Fiddle Demo (прокрутите вниз, так как он имеет два набора результатов)
Изменить Произошла ошибка при чтении вопроса, я сгруппировал его только по идентификатору. Но два group_contacts необходимы, если (значения должны быть объединены, сгруппированы по имени и идентификатору, а затем по всем идентификаторам). Предыдущий ответ был
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Вы можете увидеть, как это реализовано здесь: SQL Fiddle Demo
GROUP_CONCAT
может без уведомления усечь его вывод до group_concat_max_len
. SET group_concat_max_len=...
поможет, но в любом случае рекомендуется проверить, что возвращаемая длина (в байтах?) меньше, чем group_concat_max_len
.
Пытаться:
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(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
Во-первых, я не вижу причин, по которым идентификатор не является уникальным, но я предполагаю, что это идентификатор, который подключается к другой таблице. Во-вторых, нет необходимости в подзапросах, которые перегружают сервер. Вы делаете это одним запросом, вот так
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(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
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 (символьное_выражение, начало, длина, символьное_выражение)
character_expression - это выражение символьных данных. character_expression может быть константой, переменной или столбцом символьных или двоичных данных.
start Целочисленное значение, указывающее местоположение для начала удаления и вставки. Если начало или длина отрицательны, возвращается пустая строка. Если start длиннее первого character_expression, возвращается пустая строка. start может иметь тип bigint.
длина Целое число, указывающее количество удаляемых символов. Если длина больше, чем первое character_expression, удаление происходит до последнего символа в последнем character_expression. длина может иметь тип bigint.
ВЫБРАТЬ id, Group_concat ( column
) FROM (SELECT id, Concat ( name
, ':', Group_concat ( value
)) AS column
FROM mytbl GROUP BY id, name) tbl GROUP BY id;