Fehler im Zusammenhang mit only_full_group_by beim Ausführen einer Abfrage in MySql


442

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_bygenug, um herauszufinden, was ich tun muss, um die Abfrage zu beheben. Kann ich die only_full_group_byOption einfach deaktivieren oder muss ich noch etwas tun?

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.



21
Dies muss die komplizierteste Fehlermeldung sein, die mir jemals begegnet ist.
Rolf

2
@Rolf Haben Sie den Fehler für die gleiche Art von Problem in Oracle gesehen? " not a GROUP BY expressionDas war's." Sie könnten genauso gut nur einen numerischen Fehlercode und überhaupt keine Nachricht haben.
Bill Karwin

Antworten:


359

Ich möchte nur hinzufügen , group_idum die GROUP BY.

Wenn SELECTSie eine Spalte GROUP BYerstellen , 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 wie COUNT(), 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. MySQL only_full_group_byaktiviert 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_idist einzigartig. Scheint vernünftig, es ist immerhin eine 'ID'.

2) das group_nameist auch einzigartig. Dies ist möglicherweise keine so vernünftige Annahme. Wenn dies nicht der Fall ist und Sie ein Duplikat haben group_namesund dann meinen Rat befolgen, um group_ides zu ergänzen GROUP 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 ...

SELECT 
  g.group_id AS 'value', 
  g.group_name AS 'text' 
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
WHERE g.active = 1 
  AND g.department_id = 1 
  AND g.manage_work_orders = 1 
  AND g.group_name != 'root' 
  AND g.group_name != 'superuser' 
GROUP BY 
  g.group_name, 
  g.group_id 
HAVING COUNT(d.user_id) > 0 
ORDER BY g.group_name

Danke, das funktioniert perfekt. Ich stimme auch zu, dass ich die Spalten qualifizieren muss. Es beseitigt jede Möglichkeit von Mehrdeutigkeiten. Ich bin gerade dabei, den Code zu reparieren. Vielen Dank für die Hilfe.
Dan Bemowski

Ich habe nicht einmal eine GROUP BYKlausel in meiner Abfrage, aber ich erhalte diesen Fehler.
Aitchkhan

@ HaroonKhan, das klingt nach einer neuen Frage. Lassen Sie mich wissen, wenn Sie es fragen und ich werde einen Blick darauf werfen.
Davmos

2
In MySQL 5.7 legen sie eine Eigenschaft fest, für die alle nicht aggregierten Felder in einer Abfrage ein GROUP BY sein müssen. Also eine Abfrage wie SELECT a, SUM (b) FROM Tabelle; bedeutet, dass sich das Feld "a" in einer GROUP BY befinden muss. Wenn Sie also kein GROUP BY haben, müssen Sie es der Abfrage hinzufügen. Es geht darum, ob Sie mindestens ein Aggregatfeld im SELECT-Teil Ihrer Abfrage haben.
user1567291

Ich musste die "Warnung" beheben, indem ich das Element der in dieser Antwort vorgeschlagenen group by-Klausel hinzufügte, da keine der Antworten, die auf sql_mode-Korrekturen hindeuteten, funktionierte. (Mein MySQL war in einer gespeicherten Prozedur, weiß aber nicht, ob das relevant war)
Zzapper

354

Sie können versuchen, die only_full_group_byEinstellung zu deaktivieren , indem Sie Folgendes ausführen:

mysql> set 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';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

MySQL 8 akzeptiert nicht, NO_AUTO_CREATE_USERso dass entfernt werden muss.


85
Dies ist eine
Problemumgehung.

1
Das Aktualisieren von /etc/mysql/my.cnf (siehe unten) ist eine nachhaltigere Lösung, da die Standardeinstellungen nach dem Neustart tendenziell wieder hergestellt werden. Und für diejenigen, die sagen, Sie sollten die Abfrage korrigieren, ist das manchmal nicht ganz einfach, wenn Sie eine schnelle Debugging-Abfrage benötigen und Dinge wie SELECT COUNT(*), t.* FROM my_table t GROUP BY col20-50 Spalten tun. Möchten Sie so viel Zeit damit verbringen, jede Spalte zur Abfrage hinzuzufügen? gruppiere nach?
Shadoweb

3
Diese "Lösung" ist ziemlich gefährlich. Sie können Modi aktivieren, die Sie zuvor deaktiviert haben, indem Sie sie blind ändern, anstatt nur das betreffende Einstellungsflag zu entfernen. Dies kann zu unerwartetem Verhalten und im schlimmsten Fall zu falschen Ergebnissen führen oder dazu, dass Ihre App (s) nicht mehr vollständig funktionieren. Daher halte ich diese Antwort für falsch.
Chris S.

1
Ich habe dies durch Aktualisieren dauerhaft gemacht, indem ich meinen aktuellen sql_mode über herausgefunden 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]
wbharding

323

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

MySQL muss wissen, welche Zeile in der Gruppe Sie suchen, was Ihnen zwei Optionen bietet

  • Sie können der Gruppenanweisung auch die gewünschte Spalte hinzufügen 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öchten
  • Sie können auch Aggregatfunktionen von MySQL verwenden, um anzugeben, nach welcher Zeile Sie innerhalb der Gruppen suchen, z. B. AVG() MIN() MAX() vollständige Liste
  • UND schließlich können Sie verwenden, ANY_VALUE()wenn Sie sicher sind, dass alle Ergebnisse innerhalb der Gruppe gleich sind. doc

25
Ich glaube nicht, dass MySQL die FIRST()Methode / Funktion unterstützt?
Ben Guild

3
Ich glaube, dass MySQL (zumindest vor 5.7) standardmäßig den ersten Wert verwendet, den es in einer Gruppe findet. Es gibt also kein FIRST (), da es früher ein Synonym für die GROUP BY-Funktion selbst war.
DrDamnit

2
@ DrDamnit, ich glaube, es war eher eine zufällige Auswahl in solchen Fällen, die zu Verwirrung führte und somit ONLY_FULL_GROUP_BYstandardmäßig aktiviert
azerafati

6
Ich kannte die Antwort bereits, aber das Beispiel mit dem farbigen Rechteck ist so einfach zu verstehen, dass ich es das nächste Mal wiederverwenden werde, wenn mich jemand danach fragt.
user327961

@azerafati gibt es so etwas wie FIRST () oder eine Abfrage, die verwendet werden kann, um den ersten Wert zu erhalten, wie es bei mir der Fall ist.
Haris

169

Wenn Sie in Ihrer aktuellen Abfrage keine Änderungen vornehmen möchten, führen Sie die folgenden Schritte aus:

  1. Vagabund ssh in Ihre Box
  2. Art: sudo vim /etc/mysql/my.cnf
  3. Scrollen Sie zum Ende der Datei und geben Sie ein A, um den Einfügemodus aufzurufen
  4. Kopieren und Einfügen

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  5. Geben Sie ein esc, um den Eingabemodus zu verlassen

  6. Geben Sie ein :wq, um vim zu speichern und zu schließen.
  7. Geben Sie ein sudo service mysql restart, um MySQL neu zu starten.

Nur ein Hinweis auf alle Vagrant-Benutzer, die versuchen, dies mit AdonisJS zu verwenden. Sie benötigen dies, um die paginateFunktion auszuführen .
Michael J. Calkins

Dies gilt natürlich nicht nur für Vagrant-Benutzer, sondern für jedes Unix-System. Beachten Sie, dass für mich der Speicherort der my.cnfDatei 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"
Valentin Grégoire

Funktioniert für mich in Mint 19.3 (Ubuntu 18.04) danke
Marco López

71

Verwenden Sie ANY_VALUE()diese Option, um auf die nicht aggregierte Spalte zu verweisen.

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

Aus MySQL 5.7-Dokumenten :

Sie können den gleichen Effekt erzielen, ohne ihn zu deaktivieren, ONLY_FULL_GROUP_BY indem Sie ANY_VALUE()auf die nicht aggregierte Spalte verweisen.

...

Diese Abfrage ist möglicherweise mit ONLY_FULL_GROUP_BYaktiviert ungültig, da die nicht aggregierte Adressspalte in der Auswahlliste in der GROUP BYKlausel nicht benannt ist:

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

Wenn Sie wissen, dass für einen bestimmten Datensatz jeder Namenswert tatsächlich den Adresswert eindeutig bestimmt, ist die Adresse effektiv funktional vom Namen abhängig. Um MySQL anzuweisen, die Abfrage zu akzeptieren, können Sie die folgende ANY_VALUE()Funktion verwenden:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

1
Als jemand, der schon seit einiger Zeit auf dieses Problem stößt, gefällt mir diese Lösung besonders gut, da Sie keine Dateien oder Einstellungen in Ihrem MySQL-Setup ändern müssen. Interessanterweise sehe ich ANY_VALUE nirgendwo anders in ähnlichen Diskussionen erwähnt - funktioniert perfekt für mich mit meinem GROUP_BY contains nonaggregated columnFehler.
adstwlearn

50

Ich werde versuchen, Ihnen zu erklären, worum es bei diesem Fehler geht.
Ab MySQL 5.7.5 ist die Option ONLY_FULL_GROUP_BYstandardmäßig aktiviert.
So laut Standard SQL92 und früher:

erlaubt keine Abfragen, für die sich die Auswahlliste, die HAVING-Bedingung oder die ORDER BY-Liste auf nicht aggregierte Spalten beziehen, die weder in der GROUP BY-Klausel benannt sind noch funktional von (eindeutig durch) GROUP BY-Spalten abhängig sind

( Lesen Sie mehr in den Dokumenten )

Also zum Beispiel:

SELECT * FROM `users` GROUP BY `name`;

Nach dem Ausführen der obigen Abfrage wird eine Fehlermeldung angezeigt.

# 1055 - Ausdruck Nr. 1 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'testsite.user.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

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 usersTabelle:
Yo

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 unterschiedliche emailFeldwerte.
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:

SELECT `name` FROM `users` GROUP BY `name`

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):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

Geben Sie hier die Bildbeschreibung ein

Nun fragen Sie sich vielleicht, warum die Verwendung ANY_VALUEnicht 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

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

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.


Danke für diese nette Antwort. Was ist, wenn ich die E-Mails auch als Array in der Ergebnisgruppe haben möchte?
Josiah

1
Sie können immer das erforderliche GROUP_CONCAT-Feld verwenden, um jeden Eintrag abzurufen.
Abraham Tugalov

Oh! Es gibt also einen Weg! Bitte helfen Sie mir in dieser Frage
Josiah

Danke für diese tolle Antwort. Was ist, wenn ich tun möchte GROUP BY DAY(created_date)? Es sieht so aus, als würde es nicht funktionieren, wenn DAY()es hinzugefügt wird.
Eskimo

41

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.cnfwiderspiegelt:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Ich habe immer noch den Fehler erhalten.

Ich musste wechseln config/database.phpvon truezu false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

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


Dang! Das war hilfreich für Laravel-Benutzer. +1 dafür.
Okafor T Kosiso

20

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.

mysql> set 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';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Fantastisch, auf dem aufgebaut, was er gesagt hat, Befehl show variables like '%sql_mode%';in MySQL-Befehlszeile einfügen, Einstellung sql_mode wird verfügbar machen
Jade Han

19

Hinzufügen von Zeilen (siehe unten) in der Datei: /etc/mysql/my.cnf

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Arbeite gut für mich. Serverversion: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)


1
Verwenden Sie RDS?
Mubasshir Pawle

@ MubasshirPawle No
Jagdeep Singh

16

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.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Great..Thank :)
Mohitesachin217

Es war mir ein Vergnügen :) @mohit
Anil Gupta

Hat mir eine Menge Zeit gespart, danke.
JoeRaid

1
Willkommen bro @TharinduEranga
Anil Gupta

1
Das Problem mit der Lösung ist jedoch, dass ich die Abfrage jedes Mal, wenn ich mysql neu starte, erneut ausführen muss. Dies bedeutet, dass die Lösung nicht dauerhaft oder dauerhaft ist.
Mushfiqur Rahman

10

Für Mac:

1.Kopieren Sie die Standardeinstellung my-default.cnf in /etc/my.cnf

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

2.Ändern Sie sql_mode in my.cnf mit Ihrem bevorzugten Editor und setzen Sie ihn auf diesen Wert

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3. Starten Sie den MySQL-Server neu.

mysql.server restart

Danke, hat auch für mich gearbeitet. Aber ich verwende die MySQL-Standardeinstellung des Mac, sodass ich keinen Brühpfad habe. Nur sudo cp my-default.cnf /etc/my.cnf
Mike Nguyen

2
@Mike Nguyen sudo cp /usr/local/mysql-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/my.cnf sudo vi /etc/my.cnf set sql_model sql_mode = STRICT_TR_ , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION Starten Sie den MySQL-Server neu.
Yong Gao

7

Dies hat mir geholfen, das gesamte Problem zu verstehen:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Und im Folgenden ein weiteres Beispiel für eine problematische Abfrage.

Problematisch:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

Gelöst durch Hinzufügen am Ende:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

Hinweis: In der Fehlermeldung in PHP erfahren Sie, wo das Problem liegt.

Beispiel:

MySQL-Abfragefehler 1140: In einer aggregierten Abfrage ohne GROUP BY enthält Ausdruck 4 der SELECT-Liste die nicht aggregierte Spalte 'db.gameplay.timestamp'. Dies ist nicht kompatibel mit sql_mode = only_full_group_by (JETZT (), INTERVALL 1 TAG) UND Benutzer-ID = 1

In diesem Fall fehlte Ausdruck Nr. 4 in GROUP BY.


1
Vielen Dank für den Hinweis auf stackoverflow.com/questions/20074562/…
cwhsu

Tolle Antwort, um dieses Problem zu lösen. Vielen Dank
Hansana Athukorala

7

Für localhost / wampserver 3 können wir sql-mode = user_mode setzen, um diesen Fehler zu entfernen:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

Starten Sie dann Wamp oder Apache neu


1
Ich weiß, dass dies möglicherweise keine langfristige Lösung für dieses Problem ist, aber es hat vorerst sicherlich geholfen. Mein Hosting-Unternehmen, Go Daddy, verwendet MySQL V5.6.33 und WampServer 3 verwendet MySQL V5.7.14. Vielen Dank für diese schnelle Lösung
Alan N

4

Sie können eine hinzufügen unique indexzu group_id; wenn Sie sicher sind, dass group_iddas 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.


2

Wenn Sie diesen Fehler bei Symfony mit dem Doctrine Query Builder haben haben und wenn dieser Fehler durch einen orderBy verursacht wird :

Achten selectSie auf die gewünschte Spalte groupByund verwenden Sie sie addGroupByanstelle von groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

Funktioniert mit Symfony3 -


1

Entschuldigung, dass Sie Ihr genaues SQL nicht verwendet haben

Ich habe diese Abfrage verwendet, um die MySQL-Warnung zu überwinden.

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

beachte den Schlüssel für mich

count(*) AS cnt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.