2017-03-31 2 views
0

Angenommen, ich habe die folgende Tabelle:MySQL GROUP_CONCAT Ordnet Werte

ID|Col1 |Col2 
1 |Test1 |Test12 
2 |Test2 |Test22 
2 |Test3 |Test32 

Wenn ich eine Abfrage wie:

SELECT GROUP_CONCAT(Col1) as First, GROUP_CONCAT(Col2) as Second WHERE ID=2 GROUP BY ID 

Es manchmal gibt die GROUP_CONCAT des neu geordnet. Zum Beispiel:

ID|First  |Second 
2 |Test2,Test3|Test32,Test22 

Während ich würde erwarten, dass es zurück:

ID|First  |Second 
2 |Test2,Test3|Test22,Test32 

Wie Sie sehen können, ist es die verketteten Werte in der Spalte mit dem Namen geschaltet ‚Zweiten‘. Wie kann ich das verhindern?

+0

Verwenden Sie 'GROUP_CONCAT (Col2 ORDER BY Col2)'. Die von 'GROUP_CONCAT' zurückgegebene Reihenfolge ist * arbitray *, da es keine inhärente Reihenfolge in einer SQL-Tabelle gibt. –

+0

Wo haben Sie eine Bestellung angegeben? –

+0

@BoundaryImposition Ich nahm an, die GROUP_CONCAT würde es zurückgeben, indem sie die gefundenen Zeilen wie row1, row2, row3 usw. anhängen. Aber anscheinend tut es nicht –

Antwort

1

Wenn Sie die Werte in einer bestimmten Reihenfolge wollen, dann order by verwenden:

SELECT GROUP_CONCAT(Col1 ORDER BY Col1) as First, 
     GROUP_CONCAT(Col2 ORDER BY col2) as Second 
FROM t 
WHERE ID = 2 
GROUP BY ID; 

Im allgemeinen SQL beschäftigt sich mit ungeordnete Sets. Wenn Sie Dinge in einer bestimmten Reihenfolge wünschen, müssen Sie die Reihenfolge explizit angeben.

+0

Dies funktioniert nur unter der Annahme, dass die Werte in den Spalten die gleiche Struktur wie A-B-C A-B-C haben. Wenn es A-B-C B-A-C ist, wird es scheitern, richtig? –

+0

@TVAvanHesteren. . . Dies gibt die Werte in einer kanonischen Reihenfolge zurück - alphabetisch. Wenn Sie eine andere Spalte haben, die die Reihenfolge angibt, können Sie diese in der ORDER BY-Klausel verwenden. –

+0

Was ich erreichen möchte ist, dass die CONCAT_GROUP Col2 die Werte in der gleichen Reihenfolge wie die CONCAT_GROUP Col1 zurückgibt, die ich bisher nicht erreichen kann. Ich habe versucht, beide auf Col1, beide auf ihrer eigenen Liste, so Col2 von Col2, Col1 von Col1. Aber es wird immer noch nicht die gefundenen Zeilen in Indizes der zurückgegebenen Gruppen –

1

In dieser Tabelle fehlt die allgemeine Spalte (PK) zum Sortieren in group_concat.

ID | GroupID | Sp1 | Col2

1 | 1 | Test1 | test12

2 | 2 | Test2 | Test22

3 | 2 | Test3 | Test32

SELECT GROUP_CONCAT(Col1 ORDER BY ID) as First, 
     GROUP_CONCAT(Col2 ORDER BY ID) as Second 
FROM t 
WHERE GroupID = 2 
GROUP BY GroupID; 

Dies behält die Reihenfolge der Gruppen concat von col1 und col2 bei.

+0

Ja wird es, aber ich habe nicht die Option, eine weitere Spalte hinzuzufügen. +1 für die Reihenfolge von innerhalb der GROUP_CONCAT obwohl nicht erkannt, dass es möglich war –