"Les colonnes non agrégées de l'instruction SELECT n'apparaissent pas dans la clause GROUP BY et sont incompatibles avec sql_mode=only_full_group_by"
P粉034571623
2023-08-20 13:44:52
<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 la colonne dans 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 | identifiant_chargement | latitude | type_document | nom_fichier |
+----+---------+---------+---------+----------+--- --------+----------------+--------------+-------------- ------- --+----------------+--------+-------------- -------+--- -----+
| 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 liées à leur fonctionnalité.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, modifiez les paramètres
sql_mode
selon 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.)Conseils importants
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 :
ousql_mode
或sql-mode
sql-mode
ONLY_FULL_GROUP_BY
Supprimez le motde la valeur et 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
RemarqueCe problème peut être résolu simplement en modifiant le schéma SQL dans MySQL, en utilisant la commande suivante :
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