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.
Zaktualizuj
podział w dwóch krokach. Najpierw otrzymujemy tabelę zawierającą wszystkie wartości (oddzielone przecinkami) względem unikalnego [Nazwa, identyfikator]. Następnie z uzyskanej tabeli otrzymujemy wszystkie nazwy i wartości jako jedną wartość dla każdego unikalnego identyfikatora Zobacz to wyjaśnione tutaj SQL Fiddle Demo (przewiń w dół, ponieważ ma dwa zestawy wyników)
Edytuj Wystąpił błąd w czytaniu pytania, pogrupowałem tylko według identyfikatora. Ale dwa group_contacts są potrzebne, jeśli (wartości mają być połączone pogrupowane według nazwy i identyfikatora, a następnie według identyfikatora). Poprzednia odpowiedź brzmiała
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Możesz zobaczyć to zaimplementowane tutaj: SQL Fiddle Demo
GROUP_CONCAT
może to po cichu obciąć swoje dane wyjściowe dogroup_concat_max_len
.SET group_concat_max_len=...
pomoże, ale i tak dobrze jest sprawdzić, czy zwracana (bajtowa?) długość jest mniejsza niżgroup_concat_max_len
.Próbować:
SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0
źródło
źródło
Po pierwsze, nie widzę powodu posiadania identyfikatora, który nie jest unikalny, ale wydaje mi się, że jest to identyfikator, który łączy się z inną tabelą. Po drugie, nie ma potrzeby wykonywania podzapytań, które pobudzają serwer. Robisz to w jednym zapytaniu, jak to
Uzyskujesz szybkie i poprawne wyniki, a wynik można podzielić przez SEPARATOR „|”. Zawsze używam tego separatora, ponieważ nie można go znaleźć w ciągu, dlatego jest wyjątkowy. Nie ma problemu z dwoma A, identyfikujesz tylko wartość. Albo możesz mieć jeszcze jedną kolumnę z literą, co jest jeszcze lepsze. Lubię to :
źródło
musisz użyć rzutowania lub konwersji, w przeciwnym razie zostanie zwrócony BLOB
wynik jest
musisz ponownie obsłużyć wynik przez program taki jak python lub java
źródło
IF OBJECT_ID('master..test') is not null Drop table test
Nazwa mojej tabeli to test, a do łączenia używam składni For XML Path (''). Funkcja stuff wstawia ciąg do innego ciągu. Usuwa określoną długość znaków w pierwszym ciągu w pozycji początkowej, a następnie wstawia drugi ciąg do pierwszego ciągu w pozycji początkowej.
Funkcje STUFF wyglądają następująco: STUFF (wyrażenie_znaku, początek, długość, wyrażenie_znaku)
znak_wyrażenie Jest wyrażeniem danych znakowych. wyrażenie_znakowe może być stałą, zmienną lub kolumną zawierającą dane znakowe lub binarne.
start Jest liczbą całkowitą określającą lokalizację rozpoczęcia usuwania i wstawiania. Jeśli początek lub długość jest ujemna, zwracany jest ciąg pusty. Jeśli początek jest dłuższy niż pierwszy znak_wyrażenie, zwracany jest łańcuch o wartości null. początek 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 większa niż pierwsze wyrażenie_znaku, usuwanie następuje aż do ostatniego znaku w ostatnim wyrażeniu_znaku. długość może być typu bigint.
źródło
SELECT id, Group_concat (
column
) FROM (SELECT id, Concat (name
, ':', Group_concat (value
)) AScolumn
FROM mytbl GROUP BY id, name) tbl GROUP BY id;źródło