Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Erreur SQL :1140, État SQL :42000

La requête suivante n'est pas valide avec ONLY_FULL_GROUP_BY activé. Le premier n'est pas valide car le nom dans la liste de sélection n'est pas nommé dans le GROUP BY clause

mysql> SELECT name, MAX(age) FROM t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)

sans colonnes GROUP est illégal s'il n'y a pas de clause GROUP BY

Vous pouvez réécrire la requête pour qu'elle fonctionne correctement en tant que

mysql> SELECT name, MAX(age) FROM t GROUP BY name;

ou

Désactivez le ONLY_FULL_GROUP_BY et l'erreur devrait disparaître.

Les liens peuvent vous aider

  1. Vous pouvez rechercher les erreurs MySQL ici
  2. group-by-functions
  3. article similaire sur stackoverflow.com
  4. un autre forum où un problème similaire a été discuté
  5. server-sql-mode

MISE À JOUR

Ceci est la réponse à votre commentaire.

But i would like to know more about disabling the Group BY mode in mysql db.  

Modes SQL du serveur

  • Le serveur MySQL peut fonctionner dans différents modes SQL et peut appliquer ces modes différemment pour différents clients, en fonction de la valeur de sql_mode variable système. Cette capacité permet à chaque application d'adapter le mode de fonctionnement du serveur à ses propres besoins.

  • Pour définir le mode SQL au démarrage du serveur, utilisez le --sql-mode="modes" option sur la ligne de commande, ou sql-mode="modes" dans un fichier d'options tel que my.cnf (Unix operating systems) ou my.ini (Windows) . modes est une liste de différents modes séparés par des virgules. Pour effacer explicitement le mode SQL, définissez-le sur une chaîne vide à l'aide de --sql-mode="" sur la ligne de commande, ou sql-mode="" dans un fichier d'options.

  • Pour changer le mode SQL à l'exécution, utilisez un

    SET [GLOBAL|SESSION] sql_mode='modes'
    instruction pour définir la variable système sql_mode. La définition de la variable GLOBAL nécessite le privilège SUPER et affecte le fonctionnement de tous les clients qui se connectent à partir de ce moment. La définition de la variable SESSION n'affecte que le client actuel. Tout client peut modifier sa propre valeur sql_mode de session à tout moment.

  • Pour déterminer la valeur sql_mode globale ou de session actuelle, utilisez les instructions suivantes :

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;

  • Vous pouvez vous référer à la tableau sql_mode

I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode
but no difference.  

Cela se produit à cause de la version de MySQL. Quelle est la version MySQL de votre ordinateur local ?

Comment vérifier la version de MySQL ?

mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.5.28    |
+-----------+
1 row in set (0.00 sec)    

Pour tester sql_mode ONLY_FULL_GROUP_BY , j'ai créé la table patient avec deux colonnes id, name et les enregistrements insérés. N'oubliez pas sql_mode ONLY_FULL_GROUP_BY n'est pas défini par défaut, vous devez le définir si vous le souhaitez.

1)MySQL version 5.0.45-community-nt

SELECT name, MAX(id) FROM patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Cela a échoué, il était inutile de définir sql_mode sur ONLY_FULL_GROUP_BY car il n'autorisera pas les colonnes non agrégées qui ne sont pas nommées dans la clause GROUP BY.

2)MySQL version 5.1.40-communauté

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Puis après avoir défini sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

3)Version MySQL 5.5.28

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Puis après avoir défini sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Conclusion

Comme vous pouvez le voir, la requête a échoué sur la version 5.0.45 et a réussi sur/après la version 5.1.40 et 5.5.28Avant la version MySQL 5.1.10(pas sûr) requête sans GROUP BY échoue quel que soit sql_mode ONLY_FULL_GROUP_BY défini ou non.

Quelques bugs intéressants et lien faq sql_mode

  1. ONLY_FULL_GROUP_BY sql mode est trop restrictif
  2. sql-mode :seul le groupe complet par mode ne fonctionne pas
  3. FAQ MySQL 5.0 :Mode SQL serveur