Как использовать 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
. Но я не уверен, как это работает.
- Каков правильный способ преобразования между mysql datetime и меткой времени python?
- MySQL: Сортировка значений GROUP_CONCAT
- MySQL: многие таблицы или многие базы данных?
- Объединение соединений node.js + mysql
- порядок запросов mysql по нескольким пунктам
- Как показать схему таблицы в базе данных MySQL?
- Компонентный ключ как внешний ключ (sql)
- Количество столбцов не соответствует значению в строке 1
- MySql: MyISAM против Inno DB!
- Планировщик событий MySQL в определенное время каждый день
- mysql - создание механизма, похожего на последовательности Oracle
- Создайте временную таблицу в инструкции SELECT без отдельной таблицы CREATE TABLE
- Что означает, когда MySQL находится в состоянии «Отправка данных»?
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.