Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wählt GROUP BY DESC seine Reihenfolge aus?

SELECT * FROM my_table GROUP BY section_identifier

ist ein ungültiger SQL Abfrage.

Wie GROUP BY funktioniert?

Lassen Sie uns die obige Abfrage abrufen und sehen, wie GROUP BY funktioniert. Zuerst wählt die Datenbank-Engine alle Zeilen aus, die mit WHERE übereinstimmen Klausel. Es gibt kein WHERE Klausel in dieser Abfrage; das bedeutet, dass alle Zeilen der Tabelle verwendet werden, um die Ergebnismenge zu generieren.

Dann gruppiert es die Zeilen unter Verwendung der in GROUP BY angegebenen Ausdrücke Klausel:

+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier    | store_id |
+----+--------------------+----------------------+----------+
| 17 | header             | header_option_one    |        1 |
| 23 | header             | header_option_three  |        0 |
+----+--------------------+----------------------+----------+
| 18 | footer             | footer_option_one    |        0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature   | homepage_feature_one |        0 |
| 25 | homepage_feature   | homepage_feature_one |        1 |
+----+--------------------+----------------------+----------+

Ich habe die Gruppen in der obigen Auflistung markiert, um alles klar zu machen.

Im nächsten Schritt erzeugt die Datenbank-Engine aus jeder Gruppe eine einzelne Zeile . Aber wie?

Die SELECT -Klausel Ihrer Abfrage ist SELECT * . * steht für die vollständige Liste der Tabellenspalten; in diesem Fall SELECT * ist eine kurze Schreibweise:

SELECT id, section_identifier, option_identifier, store_id

Lassen Sie uns die Werte der Spalte id analysieren für die erste Gruppe. Welchen Wert sollte die Datenbank-Engine für id wählen ? 17 oder 23 ? Warum 17 und warum 23 ?

Es gibt keine Kriterien, um 17 zu bevorzugen über 23 . Es wählt einfach eine davon aus (wahrscheinlich 17 aber das hängt von vielen internen Faktoren ab) und geht eins.

Es ist kein Problem, den Wert für section_identifier zu ermitteln . Es ist die Spalte, die für GROUP BY verwendet wird , alle seine Werte in einer Gruppe sind gleich.

Das Auswahldilemma tritt erneut bei den Spalten option_identifier auf und store_id .

Gemäß dem Standard SQL Ihre Abfrage ist ungültig und kann nicht ausgeführt werden. Einige Datenbank-Engines führen es jedoch wie oben beschrieben aus. Die Werte für Ausdrücke, die nicht (mindestens einer der folgenden) sind:

  • verwendet in GROUP BY Klausel;
  • verwendet mit GROUP BY Aggregatfunktionen im SELECT Klausel;
  • funktional abhängig von Spalten, die in GROUP BY verwendet werden Klausel;

sind unbestimmt.

Ab Version 5.7.5 , MySQL implementiert Erkennung funktionaler Abhängigkeiten und standardmäßig weist es ein ungültiges GROUP BY zurück Abfrage wie Ihre.

So funktioniert es

Mir ist nicht klar, wie Sie die Ergebnismenge erhalten möchten. Wie auch immer, wenn Sie einige Zeilen aus der Tabelle erhalten möchten, dann GROUP BY nicht der richtige Weg, es zu tun. GROUP BY nicht Zeilen aus einer Tabelle auswählen, generiert es neue Werte unter Verwendung der Werte aus der Tabelle. Eine von GROUP BY generierte Zeile stimmen meistens mit keiner Zeile aus der Quelltabelle überein.

Eine mögliche Lösung für Ihr Problem finden Sie in dieser Antwort . Sie müssen die Abfrage selbst schreiben, nachdem Sie die Idee gelesen und verstanden haben (und Ihnen sehr klar ist, wie die "Gewinner"-Zeilen ausgewählt werden sollten).