66

我的查询:

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 显示上面的错误你能帮我吗
4

11 回答 11

106

我很难让它工作我已经测试过它并且它在灯服务器 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。

完毕!

于 2016-06-23T22:24:54.740 回答
60

这对我有用:

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

第一步可能需要 sudo:

sudo mysql -u root -p
于 2017-02-12T02:49:03.797 回答
27

您需要在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 文档中概述了执行此操作的不同方法。这是我上面所说的 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

于 2016-06-21T18:21:04.993 回答
22

您可以通过某些命令禁用 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';

我已经尝试过并为我工作。谢谢 :)

于 2017-08-29T18:18:46.837 回答
17

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

点击这里查看图片

于 2018-06-28T12:53:50.380 回答
6

NOT IN您必须按该group by子句的任何内容进行汇总。

所以,有两种选择......将 Credit_InitialDisponible_v添加到group by

或者

MAX( Credit_Initial ) as Credit_Initial, MAX( Disponible_v ) as Disponible_v如果您知道这些值无论如何都是恒定的并且没有其他影响,请将它们更改为。

于 2016-06-21T18:20:20.713 回答
4

基于 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
于 2016-06-21T18:21:12.233 回答
2

所以让我们完全理解,假设您有一个在 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

⚠️ MariaDB 不存在 ANY_VALUE

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

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', ''));

小说见谅,希望对你有帮助。

于 2019-10-30T11:23:37.733 回答
0

8.0+ 版本也发生了同样的事情。默认情况下,在 8.0+ 版本中,它默认为“启用”。这里是链接官方文档参考

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

要禁用它,请按照@Miloud BAKTETE 建议的相同步骤操作

于 2019-07-24T12:03:42.920 回答
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';
于 2021-03-02T11:53:09.177 回答
-1

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

于 2017-08-25T06:52:42.473 回答