Eu atualizei meu sistema e instalei o MySql 5.7.9 com php para um aplicativo da Web em que estou trabalhando. Eu tenho uma consulta que é criada dinamicamente e, quando executada em versões mais antigas do MySql, funciona bem. Desde a atualização para 5,7, recebo este erro:
A expressão nº 1 da lista SELECT não está na cláusula GROUP BY e contém a coluna não agregada 'support_desk.mod_users_groups.group_id', que não depende funcionalmente das colunas da cláusula GROUP BY; isso é incompatível com sql_mode = only_full_group_by
Observe a página Manual do Mysql 5.7 no tópico Modos SQL do servidor .
Esta é a consulta que está me dando problemas:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Eu pesquisei sobre o assunto no Google, mas não entendo o only_full_group_by
suficiente para descobrir o que preciso fazer para corrigir a consulta. Posso simplesmente desativar a only_full_group_by
opção ou há outra coisa que preciso fazer?
Entre em contato se precisar de mais informações.
fonte
not a GROUP BY expression
" É isso aí. Eles podem também ter apenas um código de erro numérico e nenhuma mensagem.Respostas:
Eu apenas adicionaria
group_id
aoGROUP BY
.Ao
SELECT
inserir uma coluna que não faz parteGROUP BY
dela, pode haver vários valores para essa coluna dentro dos grupos, mas haverá apenas espaço para um único valor nos resultados. Portanto, o banco de dados geralmente precisa ser informado exatamente como transformar esses vários valores em um único valor. Normalmente, isso é feito com uma função de agregação, comoCOUNT()
,SUM()
,MAX()
etc ... Eu digo geralmente porque a maioria dos outros sistemas de banco de dados populares insistir nisso. No entanto, no MySQL anterior à versão 5.7, o comportamento padrão foi mais indulgente porque não reclama e depois escolhe arbitrariamente qualquer valor ! Também tem umANY_VALUE()
função que poderia ser usada como outra solução para essa pergunta se você realmente precisasse do mesmo comportamento de antes. Essa flexibilidade tem um custo porque é não determinística, portanto, eu não a recomendaria, a menos que você tenha um bom motivo para precisar. Agora, o MySQL está ativando aonly_full_group_by
configuração por boas razões, por isso é melhor se acostumar com isso e fazer com que suas consultas estejam em conformidade.Então, por que minha resposta simples acima? Fiz algumas suposições:
1) o
group_id
é único. Parece razoável, afinal de contas, é um 'ID'.2) o
group_name
também é único. Isso pode não ser uma suposição razoável. Se esse não for o caso, e você tiver alguma duplicatagroup_names
e, em seguida, seguir meu conselho para adicionágroup_id
-laGROUP BY
, poderá descobrir que agora obtém mais resultados do que antes, porque os grupos com o mesmo nome agora terão linhas separadas nos resultados. Para mim, isso seria melhor do que ocultar esses grupos duplicados porque o banco de dados selecionou discretamente um valor arbitrariamente!Também é uma boa prática qualificar todas as colunas com o nome ou o alias da tabela quando houver mais de uma tabela envolvida ...
fonte
GROUP BY
cláusula na minha consulta, mas estou recebendo esse erro.Você pode tentar desativar a
only_full_group_by
configuração executando o seguinte:O MySQL 8 não aceita e,
NO_AUTO_CREATE_USER
portanto, precisa ser removido.fonte
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
você tem 20 a 50 colunas, deseja gastar tanto tempo adicionando cada coluna ao agrupar por?SELECT @@sql_mode;
e, em seguida, adicionando o resultado de lá para my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
você pode desativar a mensagem de aviso conforme explicado nas outras respostas ou pode entender o que está acontecendo e corrigi-lo.
No MySQL 5.7.5, o modo SQL padrão inclui ONLY_FULL_GROUP_BY, o que significa que quando você agrupa linhas e seleciona algo dentre esses grupos, é necessário dizer explicitamente de qual linha a seleção deve ser feita.
O Mysql precisa saber qual linha do grupo você está procurando, o que oferece duas opções
group by rect.color, rect.value
que pode ser o que você quer em alguns casos, caso contrário, retornaria resultados duplicados com a mesma cor que você pode não quererAVG()
MIN()
MAX()
lista completaANY_VALUE()
se tiver certeza de que todos os resultados dentro do grupo são iguais. docfonte
FIRST()
método / função?ONLY_FULL_GROUP_BY
por padrãoSe você não quiser fazer alterações na sua consulta atual, siga as etapas abaixo -
sudo vim /etc/mysql/my.cnf
A
para entrar no modo de inserçãoCopiar e colar
Digite
esc
para sair do modo de entrada:wq
para salvar e fechar o vim.sudo service mysql restart
para reiniciar o MySQL.fonte
paginate
função.my.cnf
arquivo era/etc
. Als observe a nova sintaxe desde:MySQL 5.7.8:
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Use
ANY_VALUE()
para se referir à coluna não agregada.Dos documentos do MySQL 5.7 :
fonte
ANY_VALUE
mencionado em nenhum outro lugar em discussões semelhantes - funciona perfeitamente para mim com o meuGROUP_BY
contains nonaggregated column
erro.Vou tentar explicar o que é esse erro.
A partir do MySQL 5.7.5, a opção
ONLY_FULL_GROUP_BY
é ativada por padrão.Assim, de acordo com o padrão SQL92 e anterior:
( leia mais em documentos )
Então, por exemplo:
Você receberá uma mensagem de erro após executar a consulta acima.
Por quê?
Como o MySQL não entende exatamente, quais valores de registros agrupados devem ser recuperados, e esse é o ponto.
IE, digamos que você tenha esses registros em sua
users
tabela:E você executará uma consulta inválida mostrada acima.
E você receberá o erro mostrado acima, porque há 3 registros com o nome
John
e é bom, mas todos eles têmemail
valores de campo diferentes .Portanto, o MySQL simplesmente não entende qual deles retornar no registro agrupado resultante.
Você pode corrigir esse problema, alterando sua consulta da seguinte maneira:
Além disso, convém adicionar mais campos à seção SELECT, mas não é possível fazer isso, se não estiverem agregados, mas houver muleta que você possa usar (mas não é altamente recomendado):
Agora, você pode perguntar: por que o uso
ANY_VALUE
não é altamente recomendado?Como o MySQL não sabe exatamente qual o valor dos registros agrupados a serem recuperados, e usando esta função, você solicita que ele busque qualquer um deles (neste caso, foi obtido o email do primeiro registro com o nome = John).
Exatamente, não posso ter nenhuma idéia de por que você gostaria que esse comportamento existisse.
Por favor, se você não me entende, leia mais sobre como o agrupamento no MySQL funciona, é muito simples.
E no final, aqui está mais uma consulta simples e válida.
Se você deseja consultar a contagem total de usuários de acordo com as idades disponíveis, anote esta consulta
O que é totalmente válido, de acordo com as regras do MySQL.
E assim por diante.
É importante entender qual é exatamente o problema e só então anotar a solução.
fonte
GROUP BY DAY(created_date)
? Parece que não funciona seDAY()
for adicionado.Estou usando o Laravel 5.3, mysql 5.7.12, no laravel homestead (0.5.0, acredito)
Mesmo depois de definir explicitamente a edição
/etc/mysql/my.cnf
para refletir:Eu ainda estava recebendo o erro.
Eu tive que mudar
config/database.php
detrue
parafalse
:Leitura adicional:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
fonte
Se você estiver usando o wamp 3.0.6 ou qualquer versão superior que não seja a estável 2.5, poderá enfrentar esse problema, primeiramente o problema é com o sql. você deve nomear os campos adequadamente. mas há outra maneira pela qual você pode resolvê-lo. clique no ícone verde do wamp. mysql-> mysql settings-> sql_mode-> none. ou no console, você pode alterar os valores padrão.
fonte
show variables like '%sql_mode%';
em linha de comando mysql, configuração sql_mode irá exporAdição de linhas (mencione abaixo) no arquivo: /etc/mysql/my.cnf
Funciona bem para mim. Versão do servidor: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
fonte
Vá para mysql ou phpmyadmin e selecione database, então simplesmente execute esta consulta e ela funcionará. Está funcionando bem para mim.
fonte
Para mac:
1.Copie o padrão my-default.cnf para /etc/my.cnf
2. Altere sql_mode no my.cnf usando seu editor favorito e configure-o para este
Reinicie o servidor MySQL.
fonte
Foi isso que me ajudou a entender toda a questão:
E no seguinte outro exemplo de uma consulta problemática.
Problemático:
Resolvido adicionando isso ao final:
Nota: Veja a mensagem de erro no PHP, que indica onde está o problema.
Exemplo:
Nesse caso, a expressão # 4 estava ausente no GROUP BY.
fonte
Para localhost / wampserver 3, podemos definir o modo sql = user_mode para remover este erro:
depois reinicie o wamp ou apache
fonte
Você pode adicionar um
unique index
agroup_id
; se você tiver certeza de quegroup_id
é único.Pode resolver seu caso sem modificar a consulta .
Uma resposta tardia, mas ainda não foi mencionada nas respostas. Talvez deva completar as respostas já abrangentes disponíveis. Pelo menos, resolveu meu caso quando tive que dividir uma tabela com muitos campos.
fonte
Se você tiver esse erro no Symfony usando o construtor de consultas de doutrina e se esse erro for causado por um orderBy :
Preste atenção
select
na coluna que você desejagroupBy
e use emaddGroupBy
vez degroupBy
:Trabalhos no Symfony3 -
fonte
Desculpas por não usar seu SQL exato
Eu usei essa consulta para superar o aviso do Mysql.
note a chave para mim ser
fonte