MySQL-Fehler: sql_mode=only_full_group_by 4 Lösungen mit Beispielen, einfach zu lösender ONLY_FULL_GROUP_BY-Fehler

​Als
Anfänger stoßen wir bei der Verwendung von MySQL immer auf verschiedene Fehlermeldungen, was Kopfschmerzen bereitet. Darunter ist eine Art Fehlermeldung, sql_mode=only_full_group_by, die sehr verbreitet ist und die einem jedes Mal, wenn sie in einem langen String auftaucht, die gute Laune nimmt.

Bildbeschreibung hier einfügen

Ein solcher Fehler tritt nicht auf, weil Ihr Code nicht gut geschrieben ist, sondern weil MySQL nach MySQL 5.7 standardmäßig den strikten SQL_MODE-Modus aktiviert, um die Daten strikt zu überprüfen. Wenn der Code eine Gruppieren-nach-Aggregationsoperation enthält, müssen die Spalten in der Auswahl, mit Ausnahme der Verwendung von Aggregationsfunktionen wie max(), min() usw., in Gruppieren nach erscheinen.

Wenn beispielsweise die folgende Situation eintritt, wird ein Fehler gemeldet:

select Beijing,Shanghai from city group by Beijing

Falls hier geändert:

select Beijing,Shanghai from city group by Beijing,Shanghai

oder so:

select Beijing from city group by Beijing

Es wird kein Fehler gemeldet.

Wenn wir den Code auf diese Weise willkürlich ändern, können wir natürlich möglicherweise nicht die gewünschten Informationen erhalten.

Wir können dieses Problem durch die folgenden vier Methoden lösen:

Methode 1: Ändern Sie die Datenbankkonfiguration direkt

Öffnen Sie zuerst die Datenbank, geben Sie ein

select @@global.sql_mode;

Zu diesem Zeitpunkt werden die folgenden Informationen zurückgegeben: (Die von verschiedenen Computern zurückgegebenen Informationen können unterschiedlich sein.)

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Wenn es ONLY_FULL_GROUP_BY enthält, setzen Sie es zurück, geben Sie den folgenden Code in die Datenbank ein und entfernen Sie ONLY_FULL_GROUP_BY:

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

Wenn wir die Datenbank jedoch erneut starten, wird sie möglicherweise in ihrem ursprünglichen Zustand wiederhergestellt, und es wird weiterhin ein ONLY_FULL_GROUP_BY-Fehler angezeigt, der eine erneute Änderung der Datenbankkonfiguration erfordert.

Gibt es eine Möglichkeit, es dauerhaft zu machen? Natürlich gibt es! Siehe Methode 2, um die geänderte Datenbankkonfiguration dauerhaft wirksam zu machen!

Methode 2: Ändern Sie die Datenbankkonfiguration (permanent)

Ändern Sie die Konfigurationsdatei my.ini

Fügen Sie eine neue Konfigurationszeile unter dem Modul [mysqld] hinzu:

sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

Nach dem Ausführen neu starten, um wirksam zu werden

Methode 3: Verwenden Sie any_value() oder group_concat()

1. any_value(): gibt den angegebenen Spaltenwert des ersten Datenelements in den Daten zurück, die in derselben Gruppe gruppiert sind. (Die Funktion any_value() wird von MySQL bereitgestellt, um die Ablehnung des Werts ONLY_FULL_GROUP_BY zu unterdrücken.)

select Beijing,any_value(Shanghai) from city group by Beijing

2. group_concat(): Die Daten, die in dieselbe Gruppe eingeteilt sind, werden standardmäßig durch Kommas getrennt wie die zurückgegebenen Daten

Bildbeschreibung hier einfügen

select Beijing,group_concat(Shanghai) from city group by Beijing

Methode 4: Verwenden Sie Ihr Gehirn und ändern Sie den Code

In Niukes Frage 206 trat beispielsweise eine ähnliche Situation auf

https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&tqId=29764&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%2 5E7%25AF%2587 %26topicId%3D82&difficulty=undefiniert&judgeStatus=undefiniert&tags=&title=

Die Themen sind wie folgt:

Bildbeschreibung hier einfügen

  1. Wenn wir nicht die obige Methode verwenden, sondern direkt die folgende Methode zur Abfrage verwenden, ist es offensichtlich, dass ein ONLY_FULL_GROUP_BY-Fehler angezeigt wird:
select dept_no,d.emp_no,max(s.salary) 
from dept_emp d 
join salaries s on d.emp_no = s.emp_no
group by d.dept_no
  1. Wir können die Denkweise ändern: erste Abfrage, um 2 Tabellen zu erhalten, eine Tabelle ist die Gehaltstabelle a der Mitarbeiter und die andere Tabelle ist die Gehaltstabelle b der höchsten Mitarbeiter in jeder Abteilung. Dann durch die Tabellenverbindung auf d.emp_no = s.emp_no, um diese beiden Tabellen zu kombinieren, durch auf a.salary = b.salary, um das Gehalt zu vereinheitlichen, das heißt, das Gehalt der Tabelle nach der Verbindung dieser beiden Tabellen ist das höchste Mitarbeitergehalt in jeder Abteilung. Schließlich wird eine weitere Abfrage durchgeführt, um Informationen über das höchste Gehalt der aktuellen Mitarbeiter in jeder Abteilung zu erhalten.
select a.dept_no, a.emp_no, b.salary
from
    (select d.dept_no, s.emp_no, s.salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no 
    ) as a
    join
    (select d.dept_no, max(s.salary) as salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no
     group by d.dept_no
    ) as b 
    on a.salary = b.salary and a.dept_no = b.dept_no
order by a.dept_no

Natürlich sollten spezifische Probleme speziell behandelt werden. Wenn Sie auf ein Problem mit einem relativ großen Unterschied stoßen, müssen Sie die Abfragemethode ändern.
Wenn Sie diese Frage üben müssen, können Sie auf den Code im Artikel klicken, um Niuke direkt einzugeben, oder den Code zum Erstellen dieser Frage im Kommentarbereich finden, ihn auf dem Computer ausführen, es ausprobieren und sehen, ob er vorhanden ist sind andere cleverere Wege, um diese Frage zu lösen.

おすすめ

転載: blog.csdn.net/qq118640594X/article/details/128024350