Les colonnes de l'instruction SELECT ne sont pas dans la clause GROUP BY et contiennent des colonnes non agrégées....Incompatible avec sql_mode=only_full_group_by
P粉521748211
2023-08-21 13:21:31
<p>J'utilise MySQL 5.7.13 avec le serveur WAMP sur mon PC Windows</p>
<p>Mon problème est lors de l'exécution de cette requête</p>
<pre class="brush:php;toolbar:false;">SELECT *
DE `tbl_customer_pod_uploads`
OÙ `load_id` = '78' ET
`statut` = 'Actif'
GROUPER PAR `proof_type`</pre>
<p>J'obtiens toujours cette erreur</p>
<blockquote>
<p>L'expression n°1 dans la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée 'returntr_prod.tbl_customer_pod_uploads.id' qui n'a aucune dépendance fonctionnelle sur les colonnes de la clause GROUP BY, ce qui est cohérent avec ; sql_mode = only_full_group_by n'est pas compatible</p>
</blockquote>
<p>Veuillez m'indiquer la meilleure solution. </p>
<p>Les résultats dont j'ai besoin sont les suivants</p>
<pre class="brush:php;toolbar:false;">+----+--------------+---------+------- ---+--------------+-----------+----------------+------- --- ----+--------------+------------+--------+--------- --- -------------+-----------+
| identifiant_utilisateur | ID_chargement | latitude | type_document | nom_fichier |
+----+---------+---------+---------+----------+--- --------+----------------+--------------+-------------- ------- --+----------------+--------+-------------- -------+--- -----+
| 1 | 1 | 78 | 21.1212 | 21.5454 | id_Card.docx 0 |
+----+---------+---------+---------+----------+--- --------+----------------+--------------+-------------- ------- --+----------------+--------+-------------- -------+--- ----+</pré>
<p><br /></p>
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 conditionsHAVING
ou les listesORDER BY
qui font référence à des éléments non -aggregate columns, Ces colonnes ne sont ni nommées dans la clauseGROUP BY
ni n'en dépendent.Pour résoudre ce problème, utilisez l'une des trois solutions suivantes
(1) PHPMyAdmin
Désactivé :
ONLY_FULL_GROUP_BY
ModeSi vous utilisez phpMyAdmin, veuillez modifier les paramètres
sql_mode
conformément à la capture d'écran ci-dessous.Modifiez la variable
de la valeursql mode
et supprimez lesql mode
变量并从值中删除ONLY_FULL_GROUP_BY
textou
(2) SQL/Invite de commandes
Désactivez en exécutant la commande suivante :
ONLY_FULL_GROUP_BY
mode.ou
(3) Ne pas utiliser
SELECT *
Ne désactivez pas le mode
ONLY_FULL_GROUP_BY
, mais plutôtdans la colonne
SELECT
查询中使用相关列。相关列指的是在group by
子句中出现的列或带有聚合函数(MAX
、MIN
、SUM
、COUNT
etc.)Instructions importantes
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 :
ousql_mode
或者sql-mode
sql-mode
ONLY_FULL_GROUP_BY
Supprimez le mot de la valeuret enregistrez le fichier.
: Si la 🎜variable n'est pas trouvée dans le fichier de configuration, veuillez insérer les 2 lignes suivantes à la fin du fichier🎜sql_mode
RemarqueCeci
Ce problème sera résolu simplement en changeant le mode SQL dans MySQL, en utilisant la commande suivante :
Ç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