Как использовать 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 . Но я не уверен, как это работает.

 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 Demo (прокрутите вниз, поскольку у него есть два набора результатов)

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

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

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

Пытаться:

 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 

Вы получаете быстрые и правильные результаты, и вы можете разделить результат на этот СЕПАРАТОР «|». Я всегда использую этот разделитель, потому что его невозможно найти внутри строки, поэтому он уникален. Нет проблем с двумя A, вы определяете только значение. Или у вас может быть еще одна копия с письмом, что еще лучше. Как это :

 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 

вы должны использовать cast или convert, иначе будет возвращен 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,''),'', ''),'','') from test _a order by 1 desc 

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

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

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

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

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

  • Можно ли использовать MySql User Defined Variable в .NET MySqlCommand?
  • Оператор SQL игнорирует, где параметр
  • Как вы издеваетесь над MySQL (без ORM) в Node.js?
  • Экспорт базы данных MySQL в базу данных SQLite
  • Как преобразовать весь набор символов базы данных MySQL и сопоставление с UTF-8?
  • Как получить возраст из поля DOB в MySQL?
  • Слишком много автоматических приращений с ON DUPLICATE KEY UPDATE
  • Как удалить все таблицы MySQL из командной строки без разрешений базы данных DROP?
  • mysqli_stmt :: bind_param (): Число элементов в строке определения типа не совпадает с числом переменных привязки
  • Как восстановить таблицу InnoDB?
  • подключиться к удаленной базе данных mysql через ssh с помощью java
  • Давайте будем гением компьютера.