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;
Sie können es hier implementiert sehen: SQL Fiddle Demo . Genau das, was Sie brauchen.
Aktualisieren Sie die
Aufteilung in zwei Schritten. Zuerst erhalten wir eine Tabelle mit allen Werten (durch Kommas getrennt) gegen ein eindeutiges [Name, ID]. Dann erhalten wir aus der erhaltenen Tabelle alle Namen und Werte als einen einzigen Wert für jede eindeutige ID. Siehe dies hier erklärt SQL Fiddle Demo (scrollen Sie nach unten, da es zwei Ergebnismengen hat)
Bearbeiten Es gab einen Fehler beim Lesen der Frage, ich hatte nur nach ID gruppiert. Es werden jedoch zwei group_contacts benötigt, wenn (Werte sollen verkettet werden, gruppiert nach Name und ID und dann insgesamt nach ID). Vorherige Antwort war
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Sie können es hier implementiert sehen: SQL Fiddle Demo
GROUP_CONCAT
die Ausgabe möglicherweise stillschweigend abgeschnitten wirdgroup_concat_max_len
.SET group_concat_max_len=...
wird helfen, aber es ist trotzdem eine gute Idee zu überprüfen, ob die zurückgegebene (Byte?) Länge kleiner als istgroup_concat_max_len
.Versuchen:
SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0
quelle
quelle
Zunächst sehe ich keinen Grund für eine ID, die nicht eindeutig ist, aber ich denke, es ist eine ID, die eine Verbindung zu einer anderen Tabelle herstellt. Zweitens sind keine Unterabfragen erforderlich, was den Server verprügelt. Sie tun dies in einer Abfrage, wie folgt
Sie erhalten schnelle und korrekte Ergebnisse und können das Ergebnis durch diesen SEPARATOR "|" teilen. Ich benutze dieses Trennzeichen immer, weil es unmöglich ist, es in einer Zeichenfolge zu finden, daher ist es einzigartig. Es ist kein Problem, zwei A zu haben. Sie identifizieren nur den Wert. Oder Sie können noch eine Spalte mit dem Buchstaben haben, was noch besser ist. So was :
quelle
Sie müssen cast oder convert verwenden, andernfalls wird BLOB zurückgegeben
Ergebnis ist
Sie müssen das Ergebnis noch einmal mit einem Programm wie Python oder Java verarbeiten
quelle
IF OBJECT_ID('master..test') is not null Drop table test
Mein Tabellenname ist test und zur Konkatination verwende ich die Syntax For XML Path (''). Die Stuff-Funktion fügt eine Zeichenfolge in eine andere Zeichenfolge ein. Es löscht eine bestimmte Länge von Zeichen in der ersten Zeichenfolge an der Startposition und fügt dann die zweite Zeichenfolge in die erste Zeichenfolge an der Startposition ein.
STUFF-Funktionen sehen folgendermaßen aus: STUFF (Zeichenausdruck, Start, Länge, Zeichenausdruck)
zeichenausdruck Ist ein Ausdruck von Zeichendaten. zeichenausdruck kann eine Konstante, Variable oder Spalte von Zeichen- oder Binärdaten sein.
start Ist ein ganzzahliger Wert, der den Speicherort für das Löschen und Einfügen angibt. Wenn Start oder Länge negativ ist, wird eine Nullzeichenfolge zurückgegeben. Wenn start länger als der erste Zeichenausdruck ist, wird eine Nullzeichenfolge zurückgegeben. Start kann vom Typ Bigint sein.
Länge Ist eine Ganzzahl, die die Anzahl der zu löschenden Zeichen angibt. Wenn die Länge länger als der erste Zeichenausdruck ist, erfolgt das Löschen bis zum letzten Zeichen im letzten Zeichenausdruck. Länge kann vom Typ Bigint sein.
quelle
SELECT-ID, Group_concat (
column
) FROM (SELECT-ID, Concat (name
, ':', Group_concat (value
)) AScolumn
FROM mytbl GROUP BY-ID, Name) tbl GROUP BY-ID;quelle