Maison > Questions et réponses > le corps du texte
P粉3005417982023-08-22 11:53:58
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 n'en dépendent.
(1) PHPMyAdmin
Désactivé : ONLY_FULL_GROUP_BY
Mode
Si vous utilisez phpMyAdmin, veuillez modifier les paramètres sql_mode
conformément à 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 point(1)或point(2)
ne sont pas définies de manière permanente et seront restaurées après chaque redémarrage.
Par conséquent, vous devez définir ceci dans le fichier de configuration (par exemple dans [mysqld]
部分的/etc/mysql/my.cnf
) afin que les modifications persistent après le 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粉2783794952023-08-22 11:13:03
Ceci
Ce problème sera résolu simplement en changeant le mode SQL dans MySQL, en utilisant la commande suivante :
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Ça marche pour moi aussi... Je l'ai utilisé parce que dans mon projet j'avais beaucoup de requêtes similaires, j'ai donc simplement changé ce modèle 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 serait d'éviter de sélectionner toutes les colonnes (SELECT *...) et d'utiliser à la place des fonctions d'agrégation sur les colonnes de regroupement, comme le fait @Tim Biegeleisen ci-dessous mentionné dans la réponse à https://stackoverflow.com/a/41887524/3602846