web-dev-qa-db-fra.com

La liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée .... incompatible avec sql_mode = only_full_group_by

AM utilisant MySQL 5.7.13 sur mon PC Windows avec WAMP Server

Voici 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`

Je reçois toujours une erreur comme ça 

L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une 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; ceci est incompatible avec sql_mode = only_full_group_by

Pouvez-vous s'il vous plaît me dire la meilleure solution ...

J'ai besoin d'un résultat comme

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
13
Dhanu K

Ce 

L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une 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; ceci est incompatible avec sql_mode = only_full_group_by

sera simplement résolu en changeant le mode SQL dans MySQL avec cette commande,

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

C’est aussi ça me convient .. J’ai utilisé ce becz dans mon projet, il y a beaucoup de requêtes comme celle-ci, alors changez ce mode SQL onli_full_group_by

Je vous remercie... :-)

52
Dhanu K

Lorsque le mode only_full_group_by de MySQL est activé, cela signifie que des règles SQL ANSI strictes s'appliqueront lors de l'utilisation de GROUP BY. En ce qui concerne votre requête, cela signifie que si vous GROUP BY de la colonne proof_type, vous ne pouvez sélectionner que deux choses:

  • la colonne proof_type, ou
  • agrégats de toute autre colonne


Par "agrégats" d'autres colonnes, j'entends par l'utilisation d'une fonction d'agrégation telle que MIN(), MAX() ou AVG() avec une autre colonne. Donc, dans votre cas, la requête suivante serait valide:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

La grande majorité des questions MySQL GROUP BY que je vois sur SO ont le mode strict désactivé, donc la requête est en cours d'exécution, mais les résultats sont incorrects. Dans votre cas, la requête ne fonctionnera pas du tout, vous obligeant à réfléchir à ce que vous voulez vraiment faire.

Remarque: Le code SQL ANSI étend ce qui peut être sélectionné dans GROUP BY en incluant également les colonnes fonctionnellement dépendantes de la (des) colonne (s) sélectionnée (s). Un exemple de dépendance fonctionnelle serait le regroupement d'une colonne de clé primaire dans une table. Puisque la clé primaire est garantie d'être unique pour chaque enregistrement, la valeur de toute autre colonne sera également déterminée. MySQL est l’une des bases de données qui permet cela (SQL Server et Oracle n’appellent pas AFAIK).

21
Tim Biegeleisen

Vous pouvez désactiver sql_mode = only_full_group_by Avec une commande, vous pouvez essayer avec le 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';
10
Anil Gupta

Utilisez n'importe quelle solution

(1) PHPMyAdmin

si vous utilisez phpMyAdmin, modifiez le paramètre "sql_mode" comme indiqué dans la capture d'écran ci-dessous .  enter image description here

Editez la variable "mode SQL" et supprimez le texte "ONLY_FULL_GROUP_BY" de la valeur

(2) Invite de commande Exécutez la commande ci-dessous. 

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

(3) Ne pas utiliser SELECT *

Utilisez la colonne appropriée dans la requête SELECT. colonnes de moyens pertinentes, qui entrent dans la clause "group by" ou avec la fonction d'agrégation (MAX, MIN, SUM, COUNT, etc.)


Note importante

Modifications apportées à l'aide de point (1) OR point (2) ne le définira PAS DE MANIÈRE PERMANENTE et sera annulé après chaque redémarrage.

Vous devriez donc le définir dans votre fichier de configuration (par exemple, /etc/mysql/my.cnf dans la section [mysqld]), afin que les modifications restent en vigueur après le redémarrage de MySQL:

Fichier de configuration: /etc/mysql/my.cnf

Nom de la variable: sql_mode OU sql-mode

5
Rakesh Soni

Pour que la requête soit légale dans SQL92, la colonne de nom doit être omise de la liste de sélection ou nommée dans la clause GROUP BY.

SQL99 et versions ultérieures autorisent ces non agrégats par fonctionnalité optionnelle T301 s'ils dépendent fonctionnellement des colonnes GROUP BY: Si une telle relation existe entre nom et client, la requête est légale. Ce serait le cas, par exemple, si une clé primaire de clients était conservée.

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 refuse 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. .

via MySQL :: Manuel de référence MySQL 5.7 :: 12.19.3 Traitement par MySQL de GROUP BY

Vous pouvez le résoudre en changeant le mode SQL avec cette commande:

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

et ... n'oubliez pas de reconnecter la base de données !!!

4
ElliotMok

Ouvrez votre panneau WAMP et ouvrez le fichier de configuration MySQL. Dans celui-ci, recherchez "sql_mode" si vous le trouvez, définissez-le sur "". Sinon, ajoutez sql_mode = "" au fichier.

Redémarrez le serveur MySQL et vous êtes prêt à partir ...

codage heureux.

<?= S ?>
0
Mohd Samgan Khan

À quoi ça ressemble, je pense que grouper par plusieurs colonnes/champs ne fera pas mal votre résultat Pourquoi n'essaies-tu pas d'ajouter au groupe comme ceci:

GROUP BY `proof_type`, `id`

Cela va regrouper par proof_type d'abord puis id. J'espère que cela ne modifie pas les résultats. Dans certains cas/la plupart des cas, grouper sur plusieurs colonnes donne des résultats erronés.

0
jkkenzie
  1. Connectez-vous à phpMyAdmin
  2. Accédez à: Serveur: localhost: 3306 et ne sélectionnez aucune base de données.
  3. Cliquez sur les variables du menu du haut
  4. Recherchez "mode SQL" et modifiez la valeur correspondante en: NO_ENGINE_SUBSTITUTION

C'est tout.

Je l'ai fait dans mon Ec2 et cela a fonctionné comme un charme.

0
PrafulPravin

La réponse de Dhanu K et Anil Gupta a fonctionné pour moi, cependant, vous devez redémarrer mysql dans le terminal pour voir le résultat.

0
Meder Mamutov