web-dev-qa-db-fra.com

# 1055 - L'expression de la liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée, ce qui est incompatible avec sql_mode = only_full_group_by.

ma question:

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) GROUP BY libelle order by libelle asc
  • Mysql 5.7.9 exécute la requête sans aucun problème mais mysql 5.7.12 affiche l'erreur ci-dessus. Pourriez-vous m'aider s'il vous plaît?
46
Miloud BAKTETE

J'ai eu du mal à le faire fonctionner, je l'ai testé et il fonctionne sur le serveur de lampes mysql version 5.12.

Alors, étapes vers le succès:

  1. Sudo vim /etc/mysql/conf.d/mysql.cnf
  2. Faites défiler jusqu'au bas du fichier Copier et coller

    [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

au bas du fichier

  1. enregistrer et quitter le mode de saisie
  2. Sudo service mysql restart pour redémarrer MySQL.

Terminé!

84
Miloud BAKTETE

Cela a fonctionné pour moi:

mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Vous aurez peut-être besoin de Sudo pour la première étape:

Sudo mysql -u root -p
39
Henry

Vous devez spécifier toutes les colonnes que vous n'utilisez pas pour une fonction d'agrégation dans votre clause GROUP BY, comme ceci:

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) GROUP BY libelle,credit_initial,disponible_v order by libelle asc

Le mode full_group_by vous permet d'écrire davantage de SQL idiomatique. Vous pouvez désactiver ce paramètre si vous le souhaitez. Il existe différentes manières de le faire qui sont décrites dans le Documentation MySQL . Voici la définition de MySQL de ce que j'ai dit ci-dessus:

MySQL 5.7.5 et supérieur implémente la détection de la dépendance fonctionnelle. Si le mode SQL ONLY_FULL_GROUP_BY est activé (ce qu'il est par défaut), MySQL rejette les requêtes pour lesquelles la liste de sélection, la condition HAVING ou la liste ORDER BY font référence à des colonnes non agrégées qui ne sont ni nommées dans la clause GROUP BY ni fonctionnellement dépendantes. . (Avant la version 5.7.5, MySQL ne détectait pas la dépendance fonctionnelle et ONLY_FULL_GROUP_BY n'était pas activé par défaut. Pour une description du comportement avant la version 5.7.5, consultez le Manuel de référence de MySQL 5.6.)

Vous obtenez l'erreur parce que vous êtes sur une version <5.7.5

19
gr1zzly be4r

Vous pouvez désactiver sql_mode = only_full_group_by par une commande, vous pouvez essayer avec un terminal ou MySql IDE

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

J'ai essayé cela et travaillé pour moi. Merci :)

15
Anil Gupta

Solution 1: supprimez ONLY_FULL_GROUP_BY de la console mysql

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

vous pouvez lire plus ici

Solution 2: Supprimez ONLY_FULL_GROUP_BY de phpmyadmin

Open phpmyadmin & select localhost
Click on menu Variables & scroll down for sql mode
Click on edit button to change the values & remove ONLY_FULL_GROUP_BY & click on save. 

click here to see image

10
Tauqueer Hassan

Vous devez agréger par n'importe quoi NOT IN la clause group by.

Donc, il y a deux options ... Ajouter Credit_Initial et Disponible_v au group by

OR

Changez-les en MAX( Credit_Initial ) as Credit_Initial, MAX( Disponible_v ) as Disponible_v si vous savez que les valeurs sont de toute façon constantes et n'ont aucun autre impact.

6
DRapp

Configuration de base et par défaut de 5.7.5 ONLY_FULL_GROUP_BY Vous devez utiliser toutes les colonnes non agrégées de votre groupe en

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type 
where type.id_type=annee.id_type 
and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) 
GROUP BY libelle,credit_initial,disponible_v order by libelle asc
4
scaisEdge

La même chose s’est produite avec les versions 8.0+. Par défaut, dans la version 8.0+, il est "activé" par défaut. Voici le lien référence du document officiel

Dans le cas des versions 5.6+, 5.7+, la propriété "ONLY_FULL_GROUP_BY" est désactivée par défaut.

Pour le désactiver, suivez les mêmes étapes suggérées par @Miloud BAKTETE

0
Atul