Jak używać GROUP CONCAT w CONCAT w MySQL

Jeśli mam tabelę z następującymi danymi w MySQL:

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9

Jak mogę to zrobić w następującym formacie?

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


Chyba muszę użyć GROUP_CONCAT. Ale nie wiem, jak to działa.

Author: Amir, 2012-11-19

7 answers

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;

Możesz zobaczyć to zaimplementowane tutaj : SQL Fiddle Demo. Dokładnie to, czego potrzebujesz.

Update Podział w dwóch krokach. Najpierw otrzymujemy tabelę zawierającą wszystkie wartości (oddzielone przecinkami) przeciwko unikalnemu[Name,id]. Następnie z otrzymanej tabeli otrzymujemy wszystkie nazwy i wartości jako pojedynczą wartość dla każdego unikalnego id Zobacz to wyjaśnione tutaj SQL Fiddle Demo (przewiń w dół, ponieważ ma dwa zestawy wyników)

Edit wystąpił błąd w czytaniu pytanie, pogrupowałem tylko według identyfikatora. Ale dwie group_contacts są potrzebne, jeśli (wartości mają być połączone pogrupowane według nazwy i id, a następnie nad wszystkimi według id). poprzednia odpowiedź to

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

Możesz zobaczyć to zaimplementowane tutaj : SQL Fiddle Demo

 166
Author: Sami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-01 22:57:56

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: http://sqlfiddle.com/#! 2 / b5abe/9/0

 22
Author: eisberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-19 10:20:56
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
 9
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 14:33:28

Po pierwsze, nie widzę powodu posiadania identyfikatora, który nie jest unikalny, ale myślę, że jest to identyfikator, który łączy się z inną tabelą. Po drugie nie ma potrzeby zapytań podrzędnych, które biją serwer. Robisz to w jednym zapytaniu, jak to

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id

Otrzymujesz szybkie i poprawne wyniki i możesz podzielić wynik przez SEPARATOR"|". Zawsze używam tego separatora, ponieważ nie można go znaleźć wewnątrz łańcucha, dlatego jest unikalny. Nie ma problemu z posiadaniem dwóch Szóstek, identyfikujesz tylko wartość. Albo możesz mieć jeszcze jedno colum, z literą, co jest jeszcze lepsze. TAK:

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
 6
Author: Lucian Minea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 16:55:15
 SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id

Musisz użyć cast lub convert, w przeciwnym razie będzie return BLOB

Wynik to

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

Musisz ponownie obsługiwać wynik za pomocą programów takich jak python lub java

 2
Author: lglcomcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 07:04:55

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

Moja nazwa tabeli to test , a do konkatinacji używam składni for XML Path ("). Funkcja stuff wstawia łańcuch do innego łańcucha. Usuwa określoną długość znaków w pierwszym łańcuchu na pozycji startowej, a następnie wstawia drugi łańcuch do pierwszego łańcucha na pozycji startowej.

Funkcje STUFF wyglądają tak: STUFF (character_expression , start , length ,character_expression)

Character_expression Jest wyrażenie danych znakowych. character_expression może być stałą, zmienną lub kolumną albo dane znakowe lub binarne.

Start Jest liczbą całkowitą określającą miejsce rozpoczęcia usuwania i wstawiania. Jeśli początek lub długość jest ujemna, zwracany jest łańcuch null. Jeśli start jest dłuższy niż pierwsze wyrażenie znakowe, zwracany jest łańcuch null. start może być typu bigint.

Długość Jest liczbą całkowitą określającą liczbę znaków do usunięcia. Jeśli długość jest dłuższy niż pierwszy znak_ekspresji, usunięcie następuje do ostatniego znaku w ostatnim wyrazie. długość może być typu bigint.

 0
Author: Novy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 09:35:30

Wybierz id, Group_concat (column) FROM (SELECT id, Concat(name, ':', Group_concat (value)) AS column Od mytbl Grupuj według id, nazwa) tbl GROUP BY id;

 0
Author: Mrigank Shekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-06 18:05:32