Maison > Questions et réponses > le corps du texte
P粉5236250802023-08-21 10:10:51
Il existe une variable système ONLY_FULL_GROUP_BY
dans le moteur MySQL.
À partir de MySQL version 5.7.5 : le mode SQL est activé par défaut ONLY_FULL_GROUP_BY
.
Avant la version 5.7.5 : Non activé par défaut ONLY_FULL_GROUP_BY
.
Si le mode ONLY_FULL_GROUP_BY
SQL模式(从5.7.5版本开始默认启用),MySQL将拒绝查询选择列表、HAVING
条件或ORDER BY
列表引用非聚合列,这些列既不在GROUP BY
SQL est activé (activé par défaut à partir de la version 5.7.5), MySQL rejettera les listes de sélection de requêtes, les conditions HAVING
ou les listes ORDER BY
qui font référence à des éléments non -aggregate columns, Ces colonnes ne sont ni nommées dans la clause GROUP BY
ni liées à leur fonctionnalité.
(1) PHPMyAdmin
Désactivé : ONLY_FULL_GROUP_BY
Mode
Si vous utilisez phpMyAdmin, modifiez les paramètres sql_mode
selon la capture d'écran ci-dessous.
Modifiez la variable sql mode
et supprimez le sql mode
变量并从值中删除ONLY_FULL_GROUP_BY
text
ou
(2) SQL/Invite de commandes
Désactivez en exécutant la commande suivante : ONLY_FULL_GROUP_BY
mode.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
ou
(3) Ne pas utiliser SELECT *
Ne désactivez pas le mode ONLY_FULL_GROUP_BY
, mais plutôt
dans la colonne SELECT
查询中使用相关列。相关列指的是在group by
子句中出现的列或带有聚合函数(MAX
、MIN
、SUM
、COUNT
etc.)
Les modifications apportées à l'aide de 点(1)或点(2)
ne sont pas des paramètres permanents et seront restaurées après chaque redémarrage.
Par conséquent, vous devez définir cela dans un fichier de configuration (par exemple, dans un fichier [mysqld]
部分的/etc/mysql/my.cnf
) pour conserver les modifications en vigueur après un redémarrage de MySQL :
Profil : /etc/mysql/my.cnf
Nom de la variable : sql_mode
或 sql-mode
sql-mode
ONLY_FULL_GROUP_BY
Supprimez le mot
de la valeur et enregistrez le fichier.
sql_mode
Remarque
[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
P粉1210816582023-08-21 00:49:48
Ce problème peut être résolu simplement en modifiant le schéma SQL dans MySQL, en utilisant la commande suivante :
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Fonctionne pour moi aussi...
J'ai utilisé cette méthode car il existe de nombreuses requêtes similaires dans mon projet, j'ai donc simplement changé le mode SQL en only_full_group_by.
Ou incluez simplement toutes les colonnes spécifiées par l'instruction SELECT dans la clause GROUP BY. sql_mode peut rester activé.
Merci... :-)
Date de mise à jour : 14 juillet 2023
Changer le schéma SQL est une solution de contournement, mais la meilleure pratique pour les langages de requête structurés est d'éviter de sélectionner toutes les colonnes (SELECT *...) et d'utiliser à la place des fonctions d'agrégation sur des colonnes groupées, comme le fait @Tim Biegeleisen ci-dessous Mentionné dans la réponse https://stackoverflow.com/a/41887524/3602846