Maison  >  Questions et réponses  >  le corps du texte

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

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粉850680329P粉850680329398 Il y a quelques jours635

répondre à tous(2)je répondrai

  • P粉099000044

    P粉0990000442023-10-11 11:07:33

    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
    

    répondre
    0
  • P粉909476457

    P粉9094764572023-10-11 00:45:13

    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

    répondre
    0
  • Annulerrépondre