Lösen Sie das Gruppieren-nach-Abfrage-Problem nach dem Upgrade von Mysql auf 5.7

Lösen Sie das Gruppieren-nach-Abfrage-Problem nach dem Upgrade von Mysql auf 5.7

Finden Sie das Problem

Nach dem Upgrade von MySQL auf MySQL 5.7 vor kurzem, bei der Durchführung einiger Group-by-Abfragen, wie der folgenden

SELECT *, count(id) als Anzahl FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20

Der folgende Fehler wird gemeldet:

Die SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte „news.id“, die funktional nicht von den Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht kompatibel mit sql_mode=only_full_group_by.

Ursachenanalyse

Der Grund liegt im MySQL 5.7-Modus. ONLY_FULL_GROUP_BY ist standardmäßig aktiviert.

ONLY_FULL_GROUP_BY ist ein von MySQL bereitgestellter SQL-Modus, der verwendet wird, um die Gültigkeit der GROUP BY-Klausel der SQL-Anweisung zu überprüfen.

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

Dies ist nicht kompatibel this is incompatible with sql_mode=only_full_group_by , nur vollständig nach zu gruppieren, d. h. zuerst während der Ausführung zu gruppieren und dann die Felder in der Gruppe entsprechend den abgefragten Feldern (ausgewählten Feldern) zu entfernen, sodass alle abgefragten Felder in den Gruppierungsbedingungen nach Gruppierung enthalten sein sollten; es gibt eine Ausnahme: Wenn die abgefragten Felder Aggregatfunktionen enthalten, müssen sie nicht in die Gruppierung nach aufgenommen werden, genau wie bei count(id) oben.

Später stellte ich fest, dass die Felder der Sortierbedingung „Sortieren nach“ auch in der Gruppe „Gruppieren nach“ enthalten sein müssen und die Sortierfelder auch aus den Gruppierungsfeldern übernommen werden. Wenn Sie es nicht verstehen, können Sie ja mal vorbeikommen und nachschauen.

Lösung:

1. set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Entfernen Sie ONLY_FULL_GROUP_BY, um SQL normal auszuführen.

2. Wenn ONLY_FULL_GROUP_BY nicht ausgewählt ist, müssen alle ausgewählten Felder in den Gruppierungsbedingungen enthalten sein (mit Ausnahme von Feldern, die Funktionen enthalten). (Wenn dieses Problem auch bei „order by“ auftritt, müssen die „order by“-Felder ebenfalls in „group by“ enthalten sein.)

3. Verwenden Sie ANY_VALUE() https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

Diese Funktion ist für GROUP BY-Abfragen nützlich, wenn der SQL-Modus ONLY_FULL_GROUP_BY aktiviert ist, und zwar für Fälle, in denen MySQL eine Abfrage ablehnt, von der Sie wissen, dass sie gültig ist, aus Gründen, die MySQL nicht ermitteln kann. Der Rückgabewert und -typ der Funktion sind dieselben wie der Rückgabewert und -typ ihres Arguments, aber das Funktionsergebnis wird für den SQL-Modus ONLY_FULL_GROUP_BY nicht überprüft.

Die obige SQL-Anweisung kann wie folgt geschrieben werden:

SELECT ANY_VALUE(id)als ID,ANY_VALUE(uid) als uid ,ANY_VALUE(username) als Benutzername,ANY_VALUE(title) als Titel,ANY_VALUE(author) als Autor,ANY_VALUE(thumb) als Daumen,ANY_VALUE(description) als Beschreibung,ANY_VALUE(content) als Inhalt,ANY_VALUE(linkurl) als linkurl,ANY_VALUE(url) als URL,ANY_VALUE(group_id) als group_id,ANY_VALUE(inputtime) als Eingabezeit, count(id) als Anzahl FROM `news` GROUP BY `group_id` ORDER BY ANY_VALUE(inputtime) DESC LIMIT 20

Ich habe die dritte Methode gewählt.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So verwenden Sie „groupby“ in einer Datentabelle für Gruppenstatistiken
  • Verwenden Sie „group by“ in Sequelize für gruppierte Aggregationsabfragen
  • Einführung in MySQL Advanced Query und Group By Collection
  • Analyse von MySQL: einzelne Tabelle eindeutig, mehrere Tabellen nach Abfrage gruppieren, um doppelte Datensätze zu entfernen
  • group by Gruppieren von Statistiken und Abfragen nach einem bestimmten Zeitraum (empfohlen)

<<:  Linux: Beispiel für das Bearbeiten des Start-, Stopp- und Neustartskripts für Springboot-JAR-Pakete

>>:  Benutzerdefinierter Vue-V-HAS-Befehl zum Implementieren der Schaltflächenberechtigungsbeurteilung

Artikel empfehlen

Eine detaillierte Erklärung, wie React Fiber funktioniert

Inhaltsverzeichnis Was ist React Fiber? Warum Rea...

Zusammenfassung der Vue-Datenreaktionsfähigkeit

Bevor wir über die Datenreaktivität sprechen, müs...

Shell-Skripteinstellungen zum Verhindern von Brute-Force-SSH

Das Shell-Skript richtet die Zugriffskontrolle ei...

HTML-Tabellen-Tag-Tutorial (46): Tabellenfußzeilen-Tag

Mit dem Tag <tfoot> wird der Stil der Tabel...

10 Fähigkeiten, die Frontend-Entwickler millionenschwer machen

Die Fähigkeiten, die Front-End-Entwickler beherrs...

Detaillierte Erklärung der Vue-Anmeldung und -Abmeldung

Inhaltsverzeichnis Login-Geschäftsprozess Impleme...

Detaillierte Schritte zur Installation von Python 3.7 auf CentOS 6.5

1. Python 3 herunterladen wget https://www.python...

Manuelle Implementierung der Instanceof-Methode in JavaScript

1. Verwendung von instanceof Mit instanceof wird ...

Neulinge lernen schnell die Schritte zum Erstellen von Website-Symbolen

<br />Original-URL: http://www.lxdong.com/po...

Docker-Image-Analysetool - Analyse des Tauchprinzips

Heute empfehle ich ein solches Open-Source-Tool z...

Detaillierte Erklärung der binären und varbinären Datentypen in MySQL

Vorwort BINARY und VARBINARY ähneln in gewisser W...

CSS-Ansichtsfenstereinheiten für schnelles Layout

CSS-Viewport-Einheiten gibt es schon seit einigen...