#1055 - SELECT列表的表达式不在GROUP BY子句中,并且包含非聚合列,这与sql_mode = only_full_group_by不兼容

Mil*_*ETE 52 mysql mysql-error-1055

我的查询:

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
Run Code Online (Sandbox Code Playgroud)
  • Mysql 5.7.9运行查询没有任何问题,但mysql 5.7.12显示上面的错误你可以帮助我

Mil*_*ETE 89

我一直在努力工作,我已经测试了它,它正在使用灯服务器mysql版本5.12

那么,成功的步骤:

  1. sudo vim /etc/mysql/conf.d/mysql.cnf
  2. 滚动到文件复制和粘贴的底部

    [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

到文件的底部

  1. 保存并退出输入模式
  2. sudo service mysql restart 重启MySQL.

完成!

  • 我通过从Ubuntu 16.04(MySQL 5.7)中的/etc/mysql/my.cnf中的sql_mode =字符串中仅删除:STRICT_TRANS_TABLES并重新启动mysql解决了同样的问题:systemctl restart mysql (5认同)
  • 文档中有一些关于这里发生了什么的信息:[https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html](https://dev.mysql.com/) doc/refman/5.7/en/group-by-handling.html)与编辑mysql.cnf(或者仅修改sql为gr1zzly be4r和scaisEdge建议)相比,一种不那么激烈的解决方法:[https:// dev. mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value](https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value ) (5认同)
  • 不要像我一样把`[mysqld]`与`[mysql]`混淆. (4认同)
  • **对于那些找不到此文件的人**我的文件名为 **my.ini** 与 **mysql.cnf** 相同 (3认同)
  • 这个答案是错误的。正确答案是修复查询。 (3认同)

Hen*_*nry 41

这对我有用:

mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

第一步你可能需要sudo:

sudo mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

  • Henry,这种方法的优点是可以有选择地应用。如果修改 my.cnf,服务器上的每个应用程序和数据库都会受到影响。OTOH,如果应用程序/帐户具有 SET GLOBAL 的权限(不确定但可以实现),您可以在运行其他查询之前在数据库准备阶段从应用程序运行此查询。它用一个违反 FULL_ORDER_GROUP_BY 的旧遗留应用程序拯救了我的培根......我只是在数据库连接初始化后立即调用它...... (3认同)
  • 最后,这也是唯一对我有用的东西 (2认同)

gr1*_*e4r 19

您需要在GROUP BY子句中指定您不用于聚合函数的所有列,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

full_group_by模式基本上使您编写更多惯用的SQL.如果您愿意,可以关闭此设置.MySQL文档中概述了不同的方法.这是MySQL对上述内容的定义:

MySQL 5.7.5及更高版本实现了对功能依赖的检测.如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样),MySQL拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于它们的非聚合列.(在5.7.5之前,MySQL不检测功能依赖性,默认情况下不启用ONLY_FULL_GROUP_BY.有关5.7.5之前行为的描述,请参阅MySQL 5.6参考手册.)

您收到错误的原因是您的版本<5.7.5

  • 如果您当前正在编写db逻辑,这是一个实际的解决方案,因为这将使您的代码更精确,并减少输出中的很多不确定性。 (3认同)

Ani*_*pta 18

您可以 通过某些命令禁用 sql_mode = only_full_group_by,您可以通过终端或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';
Run Code Online (Sandbox Code Playgroud)

我试过这个并为我工作过.谢谢 :)

  • 如果重启MySQL,问题将会再次出现。所以这不是一个永久的解决办法。 (3认同)

小智 12

解决方案1:从mysql控制台中删除ONLY_FULL_GROUP_BY

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多

解决方案2:从phpmyadmin中删除ONLY_FULL_GROUP_BY

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. 
Run Code Online (Sandbox Code Playgroud)

点击这里查看图片

  • 如果重启MySQL,问题将会再次出现。所以这不是一个永久的解决办法。 (3认同)

小智 9

因此,让我们充分理解,假设您有一个在本地主机中工作但在生产模式下不起作用的查询,这是因为MySQL 5.7 and above他们决定默认激活sql_mode=only_full_group_by,基本上它是一种严格模式,阻止您选择非聚合字段。

\n\n

这是查询(在本地工作但不在生产模式下工作):

\n\n
SELECT post.*, YEAR(created_at) as year\nFROM post\nGROUP BY year\n\nSELECT post.id, YEAR(created_at) as year  // This will generate an error since there are many ids\nFROM post\nGROUP BY year\n
Run Code Online (Sandbox Code Playgroud)\n\n

要验证是否已sql_mode=only_full_group_by激活,您应该执行以下查询:

\n\n
SELECT @@sql_mode;   //localhost\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出IGNORE_SPACE, STRICT_TRANS, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\n(如果您没有看到它,则表示它已停用)

\n\n

但如果在生产模式下尝试,或者在某个地方出现错误,则应该激活它:

\n\n
SELECT @@sql_mode;   //production\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO... \n这就是ONLY_FULL_GROUP_BY我们要在这里寻找的。

\n\n

否则,如果您使用phpMyAdmin,则转到 ->Variables并搜索sql_mode

\n\n

让我们以前面的例子为例并对其进行调整:

\n\n
SELECT MIN(post.id), YEAR(created_at) as year  //Here we are solving the problem with MIN()\nFROM post\nGROUP BY year\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样对于MAX()

\n\n

如果我们想要所有 ID,我们将需要:

\n\n
SELECT GROUP_CONCAT(post.id SEPARATOR ','), YEAR(created_at) as year\nFROM post\nGROUP BY year\n
Run Code Online (Sandbox Code Playgroud)\n\n

或另一个新添加的功能:

\n\n
SELECT ANY_VALUE(post.id), YEAR(created_at) as year \nFROM post\nGROUP BY year\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x9a\xa0\xef\xb8\x8f MariaDB 不存在 ANY_VALUE

\n\n

如果您想要所有字段,那么您可以使用相同的:

\n\n
SELECT ANY_VALUE(post.id), ANY_VALUE(post.slug), ANY_VALUE(post.content) YEAR(created_at) as year \nFROM post\nGROUP BY year\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x9d\x8c 要停用,sql_mode=only_full_group_by您需要执行以下查询:

\n\n
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));\n
Run Code Online (Sandbox Code Playgroud)\n\n

抱歉小说,希望对你有帮助。

\n


sca*_*dge 7

基于 5.7.5 ONLY_FULL_GROUP_BY 的默认配置您应该使用组中所有非聚合列

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
Run Code Online (Sandbox Code Playgroud)


DRa*_*app 6

你必须通过什么聚合NOT INgroup by条款.

所以,有两个选项... 添加Credit_InitialDisponible_vgroup by

要么

MAX( Credit_Initial ) as Credit_Initial, MAX( Disponible_v ) as Disponible_v如果您知道值无论如何都要保持不变并且没有其他影响,请将它们更改为.