Ich habe mein System aktualisiert und MySql 5.7.9 mit PHP für eine Webanwendung installiert, an der ich arbeite. Ich habe eine Abfrage, die dynamisch erstellt wird, und wenn sie in älteren Versionen von MySQL ausgeführt wird, funktioniert sie einwandfrei. Seit dem Upgrade auf 5.7 erhalte ich folgende Fehlermeldung:
Ausdruck Nr. 1 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'support_desk.mod_users_groups.group_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
Beachten Sie die Handbuchseite für MySQL 5.7 zum Thema Server-SQL-Modi .
Dies ist die Abfrage, die mir Probleme bereitet:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Ich habe ein bisschen gegoogelt, aber ich verstehe nicht only_full_group_by
genug, um herauszufinden, was ich tun muss, um die Abfrage zu beheben. Kann ich die only_full_group_by
Option einfach deaktivieren oder muss ich noch etwas tun?
Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
quelle
not a GROUP BY expression
Das war's." Sie könnten genauso gut nur einen numerischen Fehlercode und überhaupt keine Nachricht haben.Antworten:
Ich möchte nur hinzufügen ,
group_id
um dieGROUP BY
.Wenn
SELECT
Sie eine SpalteGROUP BY
erstellen , die nicht Teil der Spalte ist, können innerhalb der Gruppen mehrere Werte für diese Spalte vorhanden sein, in den Ergebnissen ist jedoch nur Platz für einen einzelnen Wert. Daher muss der Datenbank normalerweise genau mitgeteilt werden, wie diese mehreren Werte zu einem Wert verarbeitet werden sollen. Üblicherweise mit einer Aggregatfunktion erfolgt dies wieCOUNT()
,SUM()
,MAX()
etc ... sage ich in der Regel , weil die meisten anderen gängigen Datenbanksysteme auf diese bestehen. In MySQL vor Version 5.7 war das Standardverhalten jedoch fehlerverzeihender, da es sich nicht beschwert und dann willkürlich einen Wert auswählt ! Es hat auch eineANY_VALUE()
Funktion, die als weitere Lösung für diese Frage verwendet werden könnte, wenn Sie wirklich das gleiche Verhalten wie zuvor benötigen. Diese Flexibilität ist mit Kosten verbunden, da sie nicht deterministisch ist. Daher würde ich sie nur empfehlen, wenn Sie einen sehr guten Grund dafür haben. MySQLonly_full_group_by
aktiviert die Einstellung jetzt aus guten Gründen standardmäßig. Daher ist es am besten, sich daran zu gewöhnen und Ihre Abfragen an diese anzupassen.Warum also meine einfache Antwort oben? Ich habe ein paar Annahmen gemacht:
1) das
group_id
ist einzigartig. Scheint vernünftig, es ist immerhin eine 'ID'.2) das
group_name
ist auch einzigartig. Dies ist möglicherweise keine so vernünftige Annahme. Wenn dies nicht der Fall ist und Sie ein Duplikat habengroup_names
und dann meinen Rat befolgen, umgroup_id
es zu ergänzenGROUP BY
, stellen Sie möglicherweise fest, dass Sie jetzt mehr Ergebnisse als zuvor erhalten, da die Gruppen mit demselben Namen jetzt separate Zeilen in den Ergebnissen haben. Für mich wäre dies besser, als diese doppelten Gruppen auszublenden, da die Datenbank einen Wert stillschweigend willkürlich ausgewählt hat!Es wird auch empfohlen, alle Spalten mit ihrem Tabellennamen oder Alias zu qualifizieren, wenn mehr als eine Tabelle beteiligt ist ...
quelle
GROUP BY
Klausel in meiner Abfrage, aber ich erhalte diesen Fehler.Sie können versuchen, die
only_full_group_by
Einstellung zu deaktivieren , indem Sie Folgendes ausführen:MySQL 8 akzeptiert nicht,
NO_AUTO_CREATE_USER
so dass entfernt werden muss.quelle
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
20-50 Spalten tun. Möchten Sie so viel Zeit damit verbringen, jede Spalte zur Abfrage hinzuzufügen? gruppiere nach?SELECT @@sql_mode;
und dann das Ergebnis von dort zu my.cnf hinzugefügt habe:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
Sie können die Warnmeldung deaktivieren, wie in den anderen Antworten erläutert, oder Sie können verstehen, was passiert, und sie beheben.
Ab MySQL 5.7.5 enthält der Standard-SQL-Modus ONLY_FULL_GROUP_BY. Wenn Sie also Zeilen gruppieren und dann etwas aus diesen Gruppen auswählen, müssen Sie explizit angeben, aus welcher Zeile diese Auswahl getroffen werden soll.
MySQL muss wissen, welche Zeile in der Gruppe Sie suchen, was Ihnen zwei Optionen bietet
group by rect.color, rect.value
In einigen Fällen kann dies die gewünschte Andernfalls werden doppelte Ergebnisse mit derselben Farbe zurückgegeben, die Sie möglicherweise nicht möchtenAVG()
MIN()
MAX()
vollständige ListeANY_VALUE()
wenn Sie sicher sind, dass alle Ergebnisse innerhalb der Gruppe gleich sind. docquelle
FIRST()
Methode / Funktion unterstützt?ONLY_FULL_GROUP_BY
standardmäßig aktiviertWenn Sie in Ihrer aktuellen Abfrage keine Änderungen vornehmen möchten, führen Sie die folgenden Schritte aus:
sudo vim /etc/mysql/my.cnf
A
, um den Einfügemodus aufzurufenKopieren und Einfügen
Geben Sie ein
esc
, um den Eingabemodus zu verlassen:wq
, um vim zu speichern und zu schließen.sudo service mysql restart
, um MySQL neu zu starten.quelle
paginate
Funktion auszuführen .my.cnf
Datei war/etc
. Beachten Sie auch die neue Syntax seitMySQL 5.7.8:
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Verwenden Sie
ANY_VALUE()
diese Option, um auf die nicht aggregierte Spalte zu verweisen.Aus MySQL 5.7-Dokumenten :
quelle
ANY_VALUE
nirgendwo anders in ähnlichen Diskussionen erwähnt - funktioniert perfekt für mich mit meinemGROUP_BY
contains nonaggregated column
Fehler.Ich werde versuchen, Ihnen zu erklären, worum es bei diesem Fehler geht.
Ab MySQL 5.7.5 ist die Option
ONLY_FULL_GROUP_BY
standardmäßig aktiviert.So laut Standard SQL92 und früher:
( Lesen Sie mehr in den Dokumenten )
Also zum Beispiel:
Nach dem Ausführen der obigen Abfrage wird eine Fehlermeldung angezeigt.
Warum?
Da MySQL nicht genau versteht, welche bestimmten Werte aus gruppierten Datensätzen abgerufen werden sollen, ist dies der Punkt.
IE nimmt an, Sie haben diese Datensätze in Ihrer
users
Tabelle:Und Sie werden eine ungültige Abfrage ausführen, die oben gezeigt wurde.
Und Sie werden die oben gezeigte Fehlermeldung erhalten, da es 3 Datensätze mit Namen gibt
John
, und es ist schön, aber alle haben unterschiedlicheemail
Feldwerte.Daher versteht MySQL einfach nicht, welche von ihnen in den resultierenden gruppierten Datensatz zurückgegeben werden sollen.
Sie können dieses Problem beheben, indem Sie Ihre Abfrage einfach wie folgt ändern:
Möglicherweise möchten Sie dem Abschnitt SELECT weitere Felder hinzufügen, dies ist jedoch nicht möglich, wenn sie nicht aggregiert sind, Sie jedoch eine Krücke verwenden können (die jedoch nicht empfohlen wird):
Nun fragen Sie sich vielleicht, warum die Verwendung
ANY_VALUE
nicht empfohlen wird.Da MySQL nicht genau weiß, welchen Wert gruppierte Datensätze abzurufen sind, und Sie diese Funktion verwenden, bitten Sie ihn, einen von ihnen abzurufen (in diesem Fall wurde die E-Mail des ersten Datensatzes mit dem Namen = John abgerufen).
Genau, ich kann mir keine Ideen einfallen lassen, warum dieses Verhalten existieren soll.
Wenn Sie mich nicht verstehen, lesen Sie bitte mehr darüber, wie das Gruppieren in MySQL funktioniert. Es ist sehr einfach.
Und am Ende ist hier noch eine einfache, aber gültige Abfrage.
Wenn Sie die Gesamtzahl der Benutzer nach dem verfügbaren Alter abfragen möchten, können Sie diese Abfrage aufschreiben
Welches ist nach MySQL-Regeln voll gültig.
Und so weiter.
Es ist wichtig zu verstehen, was genau das Problem ist, und erst dann die Lösung aufzuschreiben.
quelle
GROUP BY DAY(created_date)
? Es sieht so aus, als würde es nicht funktionieren, wennDAY()
es hinzugefügt wird.Ich verwende Laravel 5.3, MySQL 5.7.12, auf einem Laravel-Gehöft (0.5.0, glaube ich).
Auch nachdem die Bearbeitung explizit so eingestellt wurde, dass sie Folgendes
/etc/mysql/my.cnf
widerspiegelt:Ich habe immer noch den Fehler erhalten.
Ich musste wechseln
config/database.php
vontrue
zufalse
:Weiterführende Literatur:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
quelle
Wenn Sie wamp 3.0.6 oder eine andere höhere Version als die stabile Version 2.5 verwenden, kann dieses Problem auftreten. Erstens liegt das Problem bei SQL. Sie müssen die Felder entsprechend benennen. Aber es gibt noch einen anderen Weg, wie Sie es lösen können. Klicken Sie auf das grüne Symbol von Wamp. mysql-> mysql settings-> sql_mode-> none. oder über die Konsole können Sie die Standardwerte ändern.
quelle
show variables like '%sql_mode%';
in MySQL-Befehlszeile einfügen, Einstellung sql_mode wird verfügbar machenHinzufügen von Zeilen (siehe unten) in der Datei: /etc/mysql/my.cnf
Arbeite gut für mich. Serverversion: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
quelle
Gehen Sie zu mysql oder phpmyadmin und wählen Sie die Datenbank aus. Führen Sie dann einfach diese Abfrage aus und es wird funktionieren. Es funktioniert gut für mich.
quelle
Für Mac:
1.Kopieren Sie die Standardeinstellung my-default.cnf in /etc/my.cnf
2.Ändern Sie sql_mode in my.cnf mit Ihrem bevorzugten Editor und setzen Sie ihn auf diesen Wert
3. Starten Sie den MySQL-Server neu.
quelle
Dies hat mir geholfen, das gesamte Problem zu verstehen:
Und im Folgenden ein weiteres Beispiel für eine problematische Abfrage.
Problematisch:
Gelöst durch Hinzufügen am Ende:
Hinweis: In der Fehlermeldung in PHP erfahren Sie, wo das Problem liegt.
Beispiel:
In diesem Fall fehlte Ausdruck Nr. 4 in GROUP BY.
quelle
Für localhost / wampserver 3 können wir sql-mode = user_mode setzen, um diesen Fehler zu entfernen:
Starten Sie dann Wamp oder Apache neu
quelle
Sie können eine hinzufügen
unique index
zugroup_id
; wenn Sie sicher sind, dassgroup_id
das einzigartig ist.Es kann Ihren Fall lösen, ohne die Abfrage zu ändern .
Eine späte Antwort, die aber in den Antworten noch nicht erwähnt wurde. Vielleicht sollte es die bereits umfassenden Antworten vervollständigen. Zumindest hat es meinen Fall gelöst, als ich eine Tabelle mit zu vielen Feldern teilen musste.
quelle
Wenn Sie diesen Fehler bei Symfony mit dem Doctrine Query Builder haben haben und wenn dieser Fehler durch einen orderBy verursacht wird :
Achten
select
Sie auf die gewünschte SpaltegroupBy
und verwenden Sie sieaddGroupBy
anstelle vongroupBy
:Funktioniert mit Symfony3 -
quelle
Entschuldigung, dass Sie Ihr genaues SQL nicht verwendet haben
Ich habe diese Abfrage verwendet, um die MySQL-Warnung zu überwinden.
beachte den Schlüssel für mich
quelle