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

Welche Nachteile hat die Bereitstellung der Datenbank in einem Docker-Container?

Vorwort Docker erfreut sich seit zwei Jahren groß...

So implementieren Sie die Fernzugriffskontrolle in Centos 7.4

1. SSH-Remoteverwaltung SSH ist ein sicheres Kana...

So erstellen Sie einen Pod in Kubernetes

Inhaltsverzeichnis Wie erstelle ich einen Pod? We...

Grundlegende Anweisungen der MySQL-Datendefinitionssprache DDL

MySQL DDL-Anweisungen Was ist DDL, DML. DDL ist e...

js zum Aufrufen der Netzwerkkamera und Behandeln häufiger Fehler

Vor kurzem musste ich aus geschäftlichen Gründen ...

So ändern Sie den Inhalt eines vorhandenen Docker-Containers

1. Docker ps listet Container auf 2. Docker cp ko...

Chinesische Parameterbeschreibung und Verwendungsbeispiele für ffmpeg

1. Wenn ffmpeg Videodateien überträgt, können die...

Docker legt Port 2375 frei, was zu Serverangriffen und -lösungen führt

Ich glaube, dass Studenten, die etwas über die Do...

CSS-Code zur Steuerung der Hintergrundfarbe der Webseite

Ich glaube, jeder macht sich oft Sorgen, ob er Bi...

Spezifische Verwendung von pthread_create in Linux zum Erstellen von Threads

pthread_create-Funktion Funktionseinführung pthre...