Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:Erro SQL:1140, SQLState:42000


A consulta a seguir é inválida com ONLY_FULL_GROUP_BY ativado. O primeiro é inválido porque o nome na lista de seleção não é nomeado no GROUP BY cláusula
mysql> SELECT name, MAX(age) FROM t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)

sem colunas GROUP é ilegal se não houver cláusula GROUP BY

Você pode reescrever a consulta para funcionar bem como
mysql> SELECT name, MAX(age) FROM t GROUP BY name;

ou

Desative o ONLY_FULL_GROUP_BY e o erro deve desaparecer.

Os links podem ajudar você
  1. Você pode pesquisar erros do MySQL aqui
  2. group-by-functions
  3. postagem semelhante em stackoverflow.com
  4. outro fórum onde um problema semelhante foi discutido
  5. server-sql-mode

ATUALIZAÇÃO

Esta é a resposta ao seu comentário.
But i would like to know more about disabling the Group BY mode in mysql db.  

Modos SQL do servidor

  • O servidor MySQL pode operar em diferentes modos SQL e pode aplicar esses modos de forma diferente para diferentes clientes, dependendo do valor do sql_mode variável do sistema. Esse recurso permite que cada aplicativo personalize o modo operacional do servidor de acordo com seus próprios requisitos.

  • Para definir o modo SQL na inicialização do servidor, use o --sql-mode="modes" opção na linha de comando ou sql-mode="modes" em um arquivo de opções como my.cnf (Unix operating systems) ou my.ini (Windows) . modos é uma lista de modos diferentes separados por vírgulas. Para limpar o modo SQL explicitamente, defina-o como uma string vazia usando --sql-mode="" na linha de comando ou sql-mode="" em um arquivo de opções.

  • Para alterar o modo SQL em tempo de execução, use um

    SET [GLOBAL|SESSION] sql_mode='modes'
    instrução para definir a variável de sistema sql_mode. Definir a variável GLOBAL requer o privilégio SUPER e afeta a operação de todos os clientes que se conectam a partir desse momento. Definir a variável SESSION afeta apenas o cliente atual. Qualquer cliente pode alterar seu próprio valor sql_mode de sessão a qualquer momento.

  • Para determinar o valor sql_mode global ou de sessão atual, use as seguintes instruções:

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

  • Você pode consultar a tabela sql_mode
I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode
but no difference.  

Isso acontece por causa da versão do MySQL. Qual é a versão do MySQL do seu computador local?

Como verificar a versão do MySQL?
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.5.28    |
+-----------+
1 row in set (0.00 sec)    

Para testar sql_mode ONLY_FULL_GROUP_BY , criei a tabela patient com duas colunas id, name e registros inseridos. Lembre-se de sql_mode ONLY_FULL_GROUP_BY não é definido padrão, você precisa definir se quiser.

1)Versão do MySQL 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  

Ele falhou, não fazia sentido definir o sql_mode para ONLY_FULL_GROUP_BY pois não permitirá colunas não agregadas que não sejam nomeadas na cláusula GROUP BY.

2)Versão do MySQL 5.1.40-community
mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Então, depois de definir 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)Versão do MySQL 5.5.28
mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Então, depois de definir 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  

Conclusão

Como você pode ver, a consulta falhou na versão 5.0.45 e foi bem-sucedida em/após 5.1.40 e 5.5.28Antes da versão do MySQL 5.1.10(não tenho certeza) consulta sem GROUP BY falha independentemente do sql_mode ONLY_FULL_GROUP_BY definido ou não.

Alguns bugs interessantes e link de perguntas frequentes do sql_mode
  1. ONLY_FULL_GROUP_BY modo SQL é excessivamente restritivo
  2. sql-mode:apenas grupo completo por modo não funciona
  3. Perguntas frequentes do MySQL 5.0:modo SQL do servidor