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

时间:2016-06-21 18:16:43

标签: 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
  • Mysql 5.7.9运行查询没有任何问题,但mysql 5.7.12 显示上面的错误你能否帮我解决这个问题

11 个答案:

答案 0 :(得分:80)

我努力工作,我已经测试了它并且它正在使用灯服务器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

  3. 到文件的底部

    1. 保存并退出输入模式
    2. sudo service mysql restart重启MySQL。
    3. 完成!

答案 1 :(得分:34)

这对我有用:

mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

第一步可能需要sudo:

sudo mysql -u root -p

答案 2 :(得分:18)

您需要在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

full_group_by模式基本上可以让你编写更多惯用的SQL。如果您愿意,可以关闭此设置。 MySQL Documentation中概述了不同的方法。这是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

答案 3 :(得分:13)

你可以禁用 的的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';

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

答案 4 :(得分:7)

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

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

您可以在此处了解更多信息

解决方案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. 

click here to see image

答案 5 :(得分:6)

您必须按NOT IN group by条款汇总{。}}。

因此,有两个选项...... 将Credit_Initial Disponible_v 添加到{{1} }

OR

如果您知道值无论如何都是常量且没有其他影响,请将它们更改为group by

答案 6 :(得分:4)

基于5.7.5 ONLY_FULL_GROUP_BY的ond defualt配置 您应该通过

使用组中的所有非聚合列
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

答案 7 :(得分:1)

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

以下是查询(在本地模式下有效,但不在生产模式下可用):

SELECT post.*, YEAR(created_at) as year
FROM post
GROUP BY year

SELECT post.id, YEAR(created_at) as year  // This will generate an error since there are many ids
FROM post
GROUP BY year

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

SELECT @@sql_mode;   //localhost

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

但是,如果在生产模式下尝试尝试,或在出现错误的地方尝试将其激活:

SELECT @@sql_mode;   //production

输出: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO... 我们正在这里寻找ONLY_FULL_GROUP_BY

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

让我们以前面的示例为例:

SELECT MIN(post.id), YEAR(created_at) as year  //Here we are solving the problem with MIN()
FROM post
GROUP BY year

MAX()

相同

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

SELECT GROUP_CONCAT(post.id SEPARATOR ','), YEAR(created_at) as year
FROM post
GROUP BY year

或另一个新添加的功能:

SELECT ANY_VALUE(post.id), YEAR(created_at) as year 
FROM post
GROUP BY year

⚠️ANY_VALUE对于MariaDB不存在

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

SELECT ANY_VALUE(post.id), ANY_VALUE(post.slug), ANY_VALUE(post.content) YEAR(created_at) as year 
FROM post
GROUP BY year

❌要停用sql_mode=only_full_group_by,则需要执行以下查询:

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

很抱歉这本小说,希望对您有所帮助。

答案 8 :(得分:0)

8.0+版本也发生了同样的事情。在8.0+版本中,默认情况下默认为“启用”。这是链接official document reference

对于5.6 +,5.7 +版本,默认情况下禁用属性“ ONLY_FULL_GROUP_BY”。

要禁用它,请遵循@Miloud BAKTETE建议的相同步骤

答案 9 :(得分:0)

此外,如果您使用 MySql 8+,请在控制台中尝试此命令:

打开 MySql 控制台

mysql -u user_name -p

并设置全局SQL模式

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION';

答案 10 :(得分:-1)

只需到窗口底部托盘单击wamp图标,单击mysql-> my.ini,然后有选项; sql-mode ="" 取消注释这使它像sql-mode ="" 并重新启动wamp 为我工作