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

Zusammenfassung der Verwendung von MySQL Online DDL gh-ost

Hintergrund: Als DBA werden die meisten DDL-Änder...

Starten Sie alle gestoppten Docker-Container mit einem Befehl neu

Starten Sie alle gestoppten Docker-Container mit ...

So beheben Sie Dateisystemfehler in Linux mit „fsck“

Vorwort Das Dateisystem ist für die Organisation ...

Details zu 7 Arten der Komponentenkommunikation in Vue3

Inhaltsverzeichnis 1. Kommunikationsmethode für V...

Detaillierte Erklärung von Javascript-Closures und -Anwendungen

Inhaltsverzeichnis Vorwort 1. Was ist ein Abschlu...

Implementierung der MySQL-Konfiguration SSL-Zertifikat-Login

Inhaltsverzeichnis Vorwort 1. MySQL ermöglicht SS...

Analyse des Unterschieds zwischen Emits und Attrs in Vue3

Inhaltsverzeichnis abschließend Praxisanalyse Erw...

Durchführung der lokalen Migration von Docker-Images

Ich habe vor Kurzem Docker gelernt und stoße dabe...

webpack -v Fehlerlösung

Hintergrund Ich möchte die Webpack-Version überpr...