SQL_MODE=only_full_group_by : La liste SELECT n'est pas dans la clause GROUP BY et contient des colonnes non agrégées....Incompatible
P粉850680329
P粉850680329 2023-10-10 13:41:44
0
2
650

J'utilise MySQL 5.7.13 avec le serveur WAMP sur un PC Windows

Mon problème est lors de l'exécution de cette requête

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

J'obtiens toujours cette erreur

L'expression n°1 de 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 ne dépend pas fonctionnellement des colonnes de la clause GROUP BY, ce qui n'est pas cohérent avec sql_mode ; =only_full_group_byCompatible

Pouvez-vous me dire la meilleure solution ?

J'ai besoin de ce résultat

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+


P粉850680329
P粉850680329

répondre à tous(2)
P粉099000044

Il existe une variable système ONLY_FULL_GROUP_BY dans le moteur MySql.

À partir de Mysql version 5.7.5 : ONLY_FULL_GROUP_BYLe mode SQL est activé par défaut

Avant la version 5.7.5  : Non activé par défaut ONLY_FULL_GROUP_BY.

Si le ONLY_FULL_GROUP_BY SQL 模式(从版本 5.7.5 开始默认启用),MySQL 将拒绝选择列表、HAVING 条件或ORDER BY 列表指的是非聚合列,这些列既未在 GROUP BY mode SQL est activé (activé par défaut à partir de la version 5.7.5), MySQL rejettera les listes de sélection, les conditions

HAVING ou les listes

ORDER BY qui font référence à des colonnes non agrégées qui ne sont ni nommés dans une clause

GROUP BY, ni fonctionnellement dépendants d'eux.

Pour résoudre le problème, utilisez l'une des solutions (1 sur 3 ci-dessous)

(1) PHPMyAdmin ONLY_FULL_GROUP_BY

Désactivé

 : Modesql_mode Si vous utilisez phpMyAdmin, modifiez les paramètres

comme indiqué dans la capture d'écran ci-dessous.

sql mode变量并从值中删除ONLY_FULL_GROUP_BY

Modifiez la variable mode SQL et supprimez text

de la valeur

ou

(2) SQL/Invite de commandesONLY_FULL_GROUP_BY

Désactiver  : désactivez le mode en exécutant la commande suivante.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

ou SELECT *

(3) Ne pas utiliser ONLY_FULL_GROUP_BY

NE PAS DÉSACTIVER LE SELECT 查询中使用相关列。相关意味着列,它们要么出现在 group by 子句中,要么出现在具有聚合函数的列(MAXMIN MODE, MAIS 代码> Dans 代码>,

SUM
,

COUNT, etc.)

point(1) OR point(2)Instructions importantes

[mysqld] 部分中的 /etc/mysql/my.cnfLes modifications apportées à l'aide de

point(1) OU point(2) ne le définissent pas de manière permanente et seront restaurées après chaque redémarrage.

Par conséquent, vous devez le définir dans un fichier de configuration (par exemple [mysqld] dans la section /etc/mysql/my.cnf/etc/mysql/my.cnf) afin que les modifications persistent lors des redémarrages de MySQL :

Fichier de configuration : sql_mode OR sql-mode/etc/mysql/my.cnf

Nom de la variableONLY_FULL_GROUP_BY :

OR

sql-mode sql_modeSupprimez le mot

🎜🎜 de la valeur et enregistrez le fichier. 🎜 🎜🎜Remarque🎜 : Si vous ne trouvez pas la variable 🎜 dans le fichier de configuration, veuillez insérer les deux lignes suivantes à la fin du fichier 🎜
[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粉909476457

Ceci

Cela peut être facilement résolu en changeant le mode SQL dans MySQL via cette commande,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Cela fonctionne pour moi aussi.. Je l'ai utilisé parce que dans mon projet il y avait beaucoup de requêtes comme celle-ci, j'ai donc simplement changé ce schéma SQL en only_full_group_by

Ou incluez uniquement toutes les colonnes dans la clause GROUP BY spécifiée par l'instruction SELECT. sql_mode peut rester activé.

Merci... :-)


Mise à jour : 14 juillet 2023

Changer le schéma SQL est une solution, mais la meilleure pratique dans les langages de requêtes structurés est toujours d'éviter de sélectionner toutes les colonnes (SELECT * ...) et d'utiliser à la place une fonction d'agrégation sur les colonnes de regroupement, comme @Tim Biegeleisen mentionné ci-dessous dans la réponse à https://stackoverflow.com/a/41887524/3602846

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal