GROUP_CONCAT ORDER BY

137

Ich habe einen Tisch wie:

+-----------+-------+------------+
| client_id | views | percentage |
+-----------+-------+------------+
|         1 |     6 |         20 |
|         1 |     4 |         55 |
|         1 |     9 |         56 |
|         1 |     2 |         67 |
|         1 |     7 |         80 |
|         1 |     5 |         66 |
|         1 |     3 |         33 |
|         1 |     8 |         34 |
|         1 |     1 |         52 |

Ich habe versucht group_concat:

SELECT li.client_id, group_concat(li.views) AS views,  
group_concat(li.percentage) FROM li GROUP BY client_id;

+-----------+-------------------+-----------------------------+
| client_id | views             | group_concat(li.percentage) |
+-----------+-------------------+-----------------------------+
|         1 | 6,4,9,2,7,5,3,8,1 | 20,55,56,67,80,66,33,34,52  |
+-----------+-------------------+-----------------------------+

Aber ich möchte die Ansichten in Ordnung bringen, wie:

+-----------+-------------------+----------------------------+
| client_id | views             | percentage                 |
+-----------+-------------------+----------------------------+
|         1 | 1,2,3,4,5,6,7,8,9 | 52,67,33,55,66,20,80,34,56 |
+-----------+-------------------+----------------------------+
ronquiq
quelle
2
Werden die Werte von Ansichten und Prozent in der Tabelle als durch Kommas getrennte Werte gespeichert?
Virendra
Nein, sie werden nicht so gespeichert, aber ich habe sie durch meine Abfrage erstellt, dh mit group_concat
ronquiq
Mögliches Duplikat von MySQL: GROUP_CONCAT-Werte
sortieren

Antworten:

304

Sie können ORDER BYdie GROUP_CONCATFunktion folgendermaßen verwenden:

SELECT li.client_id, group_concat(li.percentage ORDER BY li.views ASC) AS views, 
group_concat(li.percentage ORDER BY li.percentage ASC) 
FROM li GROUP BY client_id
aleroot
quelle
11
Sollte es nicht group_concat(li.percentage ORDER BY li.views ASC)so sein, dass die Prozentsätze in der Reihenfolge angezeigt werden, die den Ansichten entspricht, wie im ursprünglichen Beitrag gefordert?
Kai Carver
@aleroot, Ist diese Abfrage MySQL-spezifisch?
Pacerier
Ja, GROUP_CONCAT ist eine reine MySQL-Funktion, jedoch kann ein ähnliches Ergebnis in einer anderen Datenbank mit einer
Ersatzfunktion
2
Wenn Sie group_concat nach demselben Ausdruck wie group_concat () bestellen, können Sie einfach schreiben group_concat(li.views ORDER BY 1). Am einfachsten!
Doin
1
falls Sie auch Trennzeichen verwenden: SELECT GROUP_CONCAT(CONCAT(u.RegionName,'-',u.UserName) ORDER BY u.RegionName SEPARATOR '@@')
Himalaya Garg
1

In IMPALA kann es bei Coders'Co problematisch sein, keine Bestellung in der GROUP_CONCAT zu haben. Wir haben eine Art Workaround dafür (wir brauchen es für Rax / Impala). Wenn Sie das GROUP_CONCAT-Ergebnis mit einer ORDER BY-Klausel in IMPALA benötigen, lesen Sie diesen Blog-Beitrag: http://raxdb.com/blog/sorting-by-regex/

JMS
quelle