Ist es möglich, mit MySQL nach mehreren Spalten zu gruppieren?

205

Ist es möglich, GROUP BYmehr als eine Spalte in einer MySQL- SELECTAbfrage zu verwenden? Beispielsweise:

GROUP BY fV.tier_id AND 'f.form_template_id'
Rhys dachte nach
quelle
3
Sie können nicht nach Zeilen gruppieren. Sie können jedoch nach Spalten gruppieren
Joe Phillips
Was ist diese Syntaxversion
Ciro Santilli 法轮功 冠状 病 六四 事件 7
1
Möglicherweise müssen Sie eine Unterabfrage durchführen, anstatt mehrere Group by-Klauseln zu verwenden.
Adam F
Während die meisten Antworten mit hohen Stimmen im Wesentlichen identisch sind (sie zeigen die richtige Syntax und erklären den Effekt des Umschaltens der Reihenfolge der beiden Spalten), sollten Sie die Antwort von Daniklad in Betracht ziehen , wenn Ihr Bedarf etwas anders ist .
ToolmakerSteve

Antworten:

292
GROUP BY col1, col2, col3
Joe Phillips
quelle
106

Ja, Sie können nach mehreren Spalten gruppieren. Beispielsweise,

SELECT * FROM table
GROUP BY col1, col2

Die Ergebnisse werden zuerst nach Spalte1 und dann nach Spalte2 gruppiert. In MySQL geht die Spalteneinstellung von links nach rechts.

php
quelle
5
Die Präferenz von links nach rechts wird auf die aufsteigende Reihenfolge der Gruppierungen angewendet und nicht auf die Spaltengruppenpräferenz. GROUP BYgilt col1+col2. zB col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2und Laufen GROUP BY col1,col2würde 1,1|1,3|2,2im Gegensatz zu 1,1|2,2wie vorgeschlagen zurückkehren. Während GROUP BY col2, col1würde Rückkehr die aufsteigende Reihenfolge von col2 ändern. 1,1|2,2|1,3 Demo: sqlfiddle.com/#!9/d5f69/1 Beachten Sie, dass die Zeilen-ID: 2 in beiden Fällen 2,2trotz Invertieren der Spalten zurückgegeben wird.
Fyrye
Noch ein Test. sqlfiddle.com/#!9/5c8763/2 Fazit. Zuerst sortiert MySQL nach der ersten definierten Spalte (mit GROUP BY). Und wenn es in der ersten definierten Spalte gleiche Ergebnisse gibt, dann sortiert nur innerhalb der gleichen Ergebnisse nach der zweiten definierten Spalte
user2360831
In Bezug auf die SUMVerwendung mit GROUP BY. Wenn GROUP BYnur durch eine Spalte, dann sind SUMalle Werte von jedem unterschiedlichen (unterschiedlichen) Spaltenwert sqlfiddle.com/#!9/1cbde2/2 . Wenn GROUP BYzwei Spalten. Dann prüft mysql zunächst, ob für den Wert der ersten Spalte unterschiedliche Werte in der zweiten Spalte vorhanden sind. Wenn ja, dann mysql SUMjeder unterschiedliche Wert der zweiten Spalte sqlfiddle.com/#!9/1cbde2/1 .
user2360831
23

Ja, aber was bedeutet die Gruppierung nach mehr als zwei Spalten? Nun, es ist dasselbe wie das Gruppieren nach jedem einzelnen Paar pro Zeile. Die Reihenfolge, in der Sie die Spalten auflisten, ändert die Art und Weise, wie die Zeilen sortiert werden.

In Ihrem Beispiel würden Sie schreiben

GROUP BY fV.tier_id, f.form_template_id

Inzwischen der Code

GROUP BY f.form_template_id, fV.tier_id

würde ähnliche Ergebnisse liefern, aber anders sortiert.

brandonCabi
quelle
17
group by fV.tier_id, f.form_template_id
Trevor
quelle
13

Um ein einfaches Beispiel zu verwenden, hatte ich einen Zähler, der eindeutige IP-Adressen pro besuchten Seite einer Site zusammenfassen musste. Das ist im Grunde eine Gruppierung nach Seitennamen und dann nach IP. Ich habe es mit einer Kombination aus DISTINCT und GROUP BY gelöst.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Daniklad
quelle
2
Diese Antwort ist erwähnenswert, da sie ein etwas anderes Problem löst als die anderen Antworten.
ToolmakerSteve
5

Wenn Sie es vorziehen (ich muss dies anwenden), nach zwei Spalten gleichzeitig zu gruppieren, habe ich gerade diesen Punkt gesehen:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
Lucas Andrade
quelle
1
Siehe die Kommentare von ypercube unter ladas Antwort. Als Alternative betrachten : SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Die Ergebnisse sehen normalerweise so aus die gleiche wie diese Antwort, aber die interne Ausführung ist ganz anders.
ToolmakerSteve
-2
GROUP BY CONCAT(col1, '_', col2)
lada
quelle
37
Ich frage mich, wie eine Antwort mit nur einer Codezeile, die 4 Jahre nach Beantwortung der Frage veröffentlicht wurde, 8 (acht!) Upvotes erhält. Während auch falsch und ineffizient neben spät und kurz.
Ypercubeᵀᴹ
8
@ ypercubeᵀᴹ warum sagst du, dass es falsch ist? Dies ist genau das, wonach ich gesucht habe, und eine korrekte Interpretation von "Gruppieren nach mehreren Spalten". Tatsächlich weiß ich nicht, warum dies nicht das Verhalten von "group by col1, col2" ist, wie ich es erwarten würde
Abram
3
@Abram pingt dich an, also siehst du meine Antwort auf NeverEndingQueue. Nachteile: Es ist weniger - viel weniger - effizient als GROUP BY col1, col2. Bei einigen Daten werden falsche Ergebnisse erzielt. Sagen col1, col2wir Werte haben: ('a_b', 'c')in einer Zeile und ('a', 'b_c')in einer anderen. Diese falsche Antwort mit GROUP BY CONCAT fasst die beiden Zeilen in einer zusammen. Die richtige Antwort wird nicht.
Ypercubeᵀᴹ
1
Übrigens hindert Sie niemand daran, den CONCAT-Ausdruck in der SELECT-Liste zu verwenden, wenn Sie ihn benötigen:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ
1
@ ypercubeᵀᴹ oops, dumm dachte ich "group by foo, bar" benahm sich wie "... group by foo union ... group by bar". Es wäre in der Tat ein ungewöhnlicher Fall, GROUP BY CONCAT.
Abram