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 .
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.
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.
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.
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.
Antworten:
quelle
Ja, Sie können nach mehreren Spalten gruppieren. Beispielsweise,
Die Ergebnisse werden zuerst nach Spalte1 und dann nach Spalte2 gruppiert. In MySQL geht die Spalteneinstellung von links nach rechts.
quelle
GROUP BY
giltcol1+col2
. zBcol1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
und LaufenGROUP BY col1,col2
würde1,1|1,3|2,2
im Gegensatz zu1,1|2,2
wie vorgeschlagen zurückkehren. WährendGROUP BY col2, col1
wü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ällen2,2
trotz Invertieren der Spalten zurückgegeben wird.GROUP BY
). Und wenn es in der ersten definierten Spalte gleiche Ergebnisse gibt, dann sortiert nur innerhalb der gleichen Ergebnisse nach der zweiten definierten SpalteSUM
Verwendung mitGROUP BY
. WennGROUP BY
nur durch eine Spalte, dann sindSUM
alle Werte von jedem unterschiedlichen (unterschiedlichen) Spaltenwert sqlfiddle.com/#!9/1cbde2/2 . WennGROUP BY
zwei 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 mysqlSUM
jeder unterschiedliche Wert der zweiten Spalte sqlfiddle.com/#!9/1cbde2/1 .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.
quelle
quelle
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.
quelle
Wenn Sie es vorziehen (ich muss dies anwenden), nach zwei Spalten gleichzeitig zu gruppieren, habe ich gerade diesen Punkt gesehen:
quelle
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.quelle
GROUP BY col1, col2
. Bei einigen Daten werden falsche Ergebnisse erzielt. Sagencol1, col2
wir 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.SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;