Zusammenfassung der Lösungen für MySQL, das „Gruppieren nach“ nicht unterstützt

Zusammenfassung der Lösungen für MySQL, das „Gruppieren nach“ nicht unterstützt

Ich habe die neueste Version von MySQL 5.7.x heruntergeladen und installiert. Standardmäßig war der Modus only_full_group_by aktiviert. Nachdem ich diesen Modus aktiviert hatte, gab die ursprüngliche group_by-Anweisung jedoch einen Fehler aus, sodass ich sie entfernte.

Sobald only_full_group_by aktiviert ist, fühlt es sich so an, als ob group by dasselbe wie distinct wird, das nur die davon betroffenen Feldinformationen abrufen kann und nicht mit anderen, nicht davon betroffenen Feldern koexistieren kann. Auf diese Weise wird die Funktion von group by sehr eingeschränkt.

Es ist besser, den Modus only_full_group_by zu aktivieren.

Denn in MySQL gibt es eine Funktion: any_value(field) ermöglicht die Darstellung von nicht gruppierenden Feldern (was den gleichen Effekt hat wie das Deaktivieren des only_full_group_by-Modus).

Spezifische Fehlermeldung:

[Err] 1055 - Ausdruck Nr. 1 der ORDER BY-Klausel ist nicht in der GROUP BY-Klausel enthalten und enthält die nicht aggregierte Spalte „information_schema.PROFILING.SEQ“, die nicht funktional von Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht kompatibel mit sql_mode=only_full_group_by

1.1. 1. Überprüfen Sie den SQL-Modus

wählen Sie @@global.sql_mode;

1.2. Der abgefragte Wert ist:

NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEIN_ENGINE_SUBSTITUTION

2. Entfernen Sie ONLY_FULL_GROUP_BY und setzen Sie den Wert zurück.

wählen Sie @@global.sql_mode;

Setzen Sie den SQL-Modus = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'.
Setzen Sie den globalen SQL-Modus = "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION".

2.1.3. Das Obige ändert den globalen SQL-Modus und gilt für neu erstellte Datenbanken. Bei einer bestehenden Datenbank müssen Sie unter den entsprechenden Daten folgenden Befehl ausführen:

SQL-Modus festlegen = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Es gibt zwei allgemeine Lösungen:

1: Die Verwendung der Funktion any_value() auf einem Feld, das kein group by in einer SQL-Abfrageanweisung erfordert, ist nicht für Projekte geeignet, die bereits viele Funktionen entwickelt haben. Schließlich muss das ursprüngliche SQL geändert werden.

3.1.

2: Ändern Sie die Konfigurationsdatei my.cnf (my.ini unter Windows) und löschen Sie das Element only_full_group_by. Wenn MySQL unseres Projekts unter Ubuntu installiert ist, suchen Sie diese Datei und öffnen Sie sie. Sie enthält kein Konfigurationselement sql_mode, sodass Sie es nicht löschen können, selbst wenn Sie möchten.

Natürlich gibt es auch andere Möglichkeiten. Öffnen Sie die MySQL-Befehlszeile und führen Sie den Befehl aus

wählen Sie @@sql_mode;
Auf diese Weise können Sie den Wert von sql_mode herausfinden, diesen Wert kopieren und das Konfigurationselement in my.cnf hinzufügen (löschen Sie die Option only_full_group_by aus dem abgefragten Wert und kopieren Sie die anderen):

sql_mode=STRICT_TRANS_TABLES,KEIN_AUTO_CREATE_USER,KEIN_ENGINE_SUBSTITUTION;
Wenn die Zeile [mysqld] auskommentiert ist, denken Sie daran, die Kommentierung wieder aufzuheben. Starten Sie dann den MySQL-Dienst neu

Hinweis: Verwenden Sie den Befehl

Setzen Sie den SQL-Modus auf STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION.

Auf diese Weise können Sie Konfigurationselemente in einer Sitzung ändern, ohne dass dies Auswirkungen auf andere Sitzungen hat.

Wenn das oben Gesagte nicht klar genug ist, lesen Sie bitte die folgende Erklärung

Rufen Sie die MySQL-Befehlszeile auf und führen Sie die folgenden beiden Anweisungen aus

Setzen Sie den globalen SQL-Modus = "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION".
setze Sitzungs-SQL-Modus = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Aber beim Neustart von MySQL wird das Problem wieder auftreten

Suchen Sie my.cnf, bearbeiten Sie es, fügen Sie den folgenden Befehl an der entsprechenden Stelle ein, starten Sie den MySQL-Dienst neu, OK, kein Fehler gemeldet.

[mysqld]
sql_mode=STRICT_TRANS_TABLES,KEINE_NULL_IM_DATUM,KEINE_NULL_DATUM,FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEINE_ENGINE_SUBSTITUTION

Beachten Sie, dass die sql_model-Anweisung im Inhaltsbereich [mysqld] platziert werden muss.

Lösung für mysql5.7, das die Gruppierung nach nicht unterstützt

1. Überprüfen Sie sql_mode

wählen Sie @@global.sql_mode

Der abgefragte Wert ist:

NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEIN_ENGINE_SUBSTITUTION

2. Entfernen Sie ONLY_FULL_GROUP_BY und setzen Sie den Wert zurück.

Setzen Sie @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'.

mysql5.7+ in Linux verwendet group by und order by und meldet einen Fehler ONLY_FULL_GROUP_BY, ohne die Konfigurationsdatei zu ändern

1. Geben Sie mysql ein
2. Abfrage sql_mode:

Wählen Sie @@GLOBAL.sql_mode;
Wählen Sie @@SESSION.sql_mode;
Wählen Sie @@sql_mode;

Habe festgestellt, dass vorne ONLY_FULL_GROUP_BY steht

3. Geben Sie in der Befehlszeile ein
setze @@GLOBAL.sql_mode=(wähle ersetzen(@@GLOBAL.sql_mode,'ONLY_FULL_GROUP_BY',''));
Legen Sie die oben genannten drei sql_homes einmal fest.

4. Beenden Sie MySQL und rufen Sie es erneut auf, um den SQL-Modus zu überprüfen.

Das ist im Wesentlichen alles.

<<:  13 JavaScript-Einzeiler, die Sie wie einen Experten aussehen lassen

>>:  Detailliertes Tutorial zur VMware-Installation des Linux CentOS 7.7-Systems

Artikel empfehlen

Über das Problem beim Schreiben von Plugins zum Mounten von DOM in vue3

Im Vergleich zu vue2 verfügt vue3 über ein zusätz...

Lernen Sie schnell die MySQL-Grundlagen

Inhaltsverzeichnis SQL verstehen SELECT verstehen...

Lassen Sie uns über Parameter in MySQL sprechen

Vorwort: In einigen früheren Artikeln haben wir h...

Eine kurze Diskussion über 12 klassische Probleme in Angular

Inhaltsverzeichnis 1. Erklären Sie bitte, was die...

CSS löst das Fehlausrichtungsproblem von Inline-Blöcken

Schluss mit Unsinn, Postleitzahl HTML-Teil <di...

js Array fill() Füllmethode

Inhaltsverzeichnis 1. fill()-Syntax 2. Verwendung...

So erreichen Sie die maximale Anzahl von Verbindungen in MySQL

Inhaltsverzeichnis Was ist der Grund für den plöt...

JavaScript-Plugin-Kapselung für Tabellenwechsel

In diesem Artikel wird der Kapselungscode von Jav...

Einführung und Verwendung des Javascript-Generators

Was ist ein Generator? Ein Generator ist ein Code...

WeChat-Applet: benutzerdefinierter TabBar-Schrittdatensatz

Inhaltsverzeichnis 1. Einleitung 2. Passen Sie de...

Sechs wichtige Selektoren in CSS (merken Sie sie sich in drei Sekunden)

Von: https://blog.csdn.net/qq_44761243/article/de...

Detaillierte Erläuterung der 6 Möglichkeiten der JS-Vererbung

Vererbung von Prototypketten Die Prototypenvererb...

Die Verwendung und Methoden von async und await in JavaScript

asynchrone Funktion und await-Schlüsselwort in JS...