Heim  >  Artikel  >  Datenbank  >  Teilen Sie die Lösung für das Gruppen-nach-Abfrage-Problem in Mysql5.7

Teilen Sie die Lösung für das Gruppen-nach-Abfrage-Problem in Mysql5.7

黄舟
黄舟Original
2017-09-14 11:38:232204Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die Lösung des nach dem Upgrade von MySQL auf 5.7 aufgetretenen Gruppen-nach-Abfrage-Problems vor des Lernens, Freunde, die es brauchen, folgen Sie bitte dem Herausgeber, um gemeinsam zu lernen.

Problem gefunden

Kürzlich, nach dem Upgrade von MySQL auf MySQL 5.7, habe ich einige Gruppierungsabfragen durchgeführt, wie zum Beispiel die folgende


SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20

meldet den folgenden Fehler:


SELECT list is not in GROUP BY clause and contains nonaggregated column ‘news.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.

Ursachenanalyse

Der Grund liegt im MySQL 5.7-Modus. ONLY_FULL_GROUP_BY ist standardmäßig aktiviert.

ONLY_FULL_GROUP_BY ist ein von MySQL bereitgestellter SQL-Modus. Dieser SQL-Modus wird verwendet, um die Gültigkeit der SQL-Anweisung GROUP BY zu überprüfen.

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

this is incompatible with sql_mode=only_full_group_byDieser Satz erinnert mich daran, dass dies gegen die MySQL-Richtlinie verstößt Die Regel ist nur vollständig gruppiert, d. h. sie wird bei der Ausführung zuerst gruppiert und die abgefragten Felder (ausgewählte Felder) werden aus dem Gruppeninhalt herausgenommen, sodass alle abgefragten Felder innerhalb der Gruppe nach Gruppierungsbedingungen einer Situation liegen sollten Ausnahme: Wenn das Abfragefeld eine Aggregatfunktion enthält, muss diese nicht in die Gruppe von aufgenommen werden, genau wie meine count(id) oben.

Später entdeckte ich, dass die Felder der Sortierbedingungen „Order by“ auch innerhalb von „group by“ liegen müssen und die Sortierfelder auch aus den gruppierten Feldern übernommen werden. Wenn Sie es nicht verstehen, können Sie einen Blick darauf werfen.

Lösung:

1.set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_pISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

NUR_FULL_GROUP_BY entfernen, um SQL normal auszuführen.

2. Wenn ONLY_FULL_GROUP_BY nicht festgelegt ist, müssen alle ausgewählten Felder innerhalb der Gruppe nach Gruppierungsbedingung liegen (mit Ausnahme von Feldern, die Funktionen enthalten). (Dieses Problem tritt auch auf, wenn Sie auf „Ordnung nach“ stoßen. Ebenso muss das Feld „Ordnung nach“ auch innerhalb der Gruppe „Gruppierung nach“ liegen.)

3. Verwenden Sie ANY_VALUE()diese Funktion https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

Diese Funktion ist Nützlich für GROUP BY-Abfragen, wenn der SQL-Modus ONLY_FULL_GROUP_BY aktiviert ist, für Fälle, in denen MySQL eine Abfrage ablehnt, von der Sie wissen, dass sie gültig ist, aus Gründen, die MySQL nicht ermitteln kann. Der Rückgabewert und -typ der Funktion ist mit dem Rückgabewert und -typ seines Arguments identisch , aber das Funktionsergebnis wird nicht für den SQL-Modus ONLY_FULL_GROUP_BY überprüft.

Zum Beispiel kann die obige SQL-Anweisung als 3 Methoden geschrieben werden.


Zusammenfassung
SELECT ANY_VALUE(id)as id,ANY_VALUE(uid) as uid ,ANY_VALUE(username) as username,ANY_VALUE(title) as title,ANY_VALUE(author) as author,ANY_VALUE(thumb) as thumb,ANY_VALUE(description) as description,ANY_VALUE(content) as content,ANY_VALUE(linkurl) as linkurl,ANY_VALUE(url) as url,ANY_VALUE(group_id) as group_id,ANY_VALUE(inputtime) as inputtime, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY ANY_VALUE(inputtime) DESC LIMIT 20

Das obige ist der detaillierte Inhalt vonTeilen Sie die Lösung für das Gruppen-nach-Abfrage-Problem in Mysql5.7. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn