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.
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
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;
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
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
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
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.
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;
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