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 imSELECT
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).