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

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.5.27 winx64

1. Installationspaket MySQL-Dienst-Downloadadress...

Detaillierte Einführung in die Mysql-Datumsabfrage

Abfrage des aktuellen Datums AKTUELLES DATUM AUSW...

Best Practices-Handbuch zum Speichern von Daten in MySQL

Inhaltsverzeichnis Vorwort Verwenden Sie keine Ze...

Ubuntu-Installation Matlab2020b, ausführliches Tutorial und Ressourcen

Inhaltsverzeichnis 1. Ressourcendateien 2. Instal...

Eine kurze Erläuterung zu Leerzeichen und Leerzeilen im HTML-Code

Alle aufeinanderfolgenden Leerzeichen oder Leerze...

vue + tp5 realisiert eine einfache Anmeldefunktion

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der Verwendung des CSS-Bereichs (Stilaufteilung)

1. Verwendung des CSS-Bereichs (Stilaufteilung) I...

So ändern Sie den Hostnamen in Linux dauerhaft

Wenn Sie Ihren Hostnamen ändern möchten, können S...

js realisiert eine schrittweise zunehmende digitale Animation

Inhaltsverzeichnis Hintergrund Erzielen Sie einen...