"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
P粉034571623 2023-08-20 13:44:52
0
2
383

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

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

SELECT * DE `tbl_customer_pod_uploads` OÙ `load_id` = '78' ET `statut` = 'Actif' GROUPER PAR `proof_type`

J'obtiens toujours cette erreur

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

Veuillez m'indiquer la meilleure solution.

Les résultats dont j'ai besoin sont les suivants

+----+--------------+---------+------- ---+--------------+-----------+----------------+------- --- ----+--------------+------------+--------+--------- --- -------------+-----------+ | identifiant_utilisateur | identifiant_chargement | latitude | type_document | nom_fichier | +----+---------+---------+---------+----------+--- --------+----------------+--------------+-------------- ------- --+----------------+--------+-------------- -------+--- -----+ | 1 | 78 | 21.1212 | 21.5454 | id_Card.docx 0 | +----+---------+---------+---------+----------+--- --------+----------------+--------------+-------------- ------- --+----------------+--------+-------------- -------+--- ----+ 


P粉034571623
P粉034571623

répondre à tous (2)
P粉523625080

Il existe une variable systèmeONLY_FULL_GROUP_BYdans le moteur MySQL.

À partir de MySQL version 5.7.5: le mode SQL est activé par défautONLY_FULL_GROUP_BY.

Avant la version 5.7.5: Non activé par défautONLY_FULL_GROUP_BY.

Si le modeONLY_FULL_GROUP_BYSQL模式(从5.7.5版本开始默认启用),MySQL将拒绝查询选择列表、HAVING条件或ORDER BY列表引用非聚合列,这些列既不在GROUP BYSQL est activé (activé par défaut à partir de la version 5.7.5), MySQL rejettera les listes de sélection de requêtes, les conditionsHAVINGou les listesORDER BYqui font référence à des éléments non -aggregate columns, Ces colonnes ne sont ni nommées dans la clauseGROUP BYni liées à leur fonctionnalité.

Pour résoudre ce problème, utilisez l'une des trois solutions suivantes

(1) PHPMyAdmin

Désactivé:ONLY_FULL_GROUP_BYMode

Si vous utilisez phpMyAdmin, modifiez les paramètressql_modeselon la capture d'écran ci-dessous.

Modifiez la variablesql modeet supprimez lesql mode变量并从值中删除ONLY_FULL_GROUP_BYtext

de la valeur

ou

(2) SQL/Invite de commandes

Désactivezen exécutant la commande suivante :ONLY_FULL_GROUP_BYmode.

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

ou

(3) Ne pas utiliserSELECT *

Ne désactivez pas le modeONLY_FULL_GROUP_BY, mais plutôt

dans la colonneSELECT查询中使用相关列。相关列指的是在group by子句中出现的列或带有聚合函数(MAXMINSUMCOUNTetc.)


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:sql_modesql-mode

ou

sql-modeONLY_FULL_GROUP_BYSupprimez le mot

de la valeur et enregistrez le fichier.sql_modeRemarque

: Si la variable n'est pas trouvée dans le fichier de configuration, veuillez insérer les 2 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粉121081658

    Ce problème peut être résolu simplement en modifiant le schéma SQL dans MySQL, en utilisant la commande suivante :

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

    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éponsehttps://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
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!