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

#1055 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this is incompatible with sql_mode=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 order by libelle asc

您必须通过任何 NOT IN group by 子句进行聚合。

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

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

您需要在 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 and up implements detection of functional dependence. If the ONLY_FULL_GROUP_BY SQL mode is enabled (which it is by default), MySQL rejects queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on them. (Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default. For a description of pre-5.7.5 behavior, see the MySQL 5.6 Reference Manual.)

您收到错误消息是因为您使用的版本低于 5.7.5

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

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

完成!

这对我有用:

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

第一步您可能需要 sudo:

sudo mysql -u root -p

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

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

我已经尝试过这个并且对我有用。 谢谢:)

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

同样的事情也发生在 8.0+ 版本上。默认情况下在 8.0+ 版本中默认为 "enabled"。这里是linkofficial document reference

对于 5.6+、5.7+ 版本,属性 "ONLY_FULL_GROUP_BY" 默认禁用。

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

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

这是查询(适用于本地但不适用于生产模式):

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

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

对不起小说,希望对你有帮助。

此外,如果您使用 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';

在 Laravel 中,您只需在文件 database.php 中设置 false

...
'mysql' => [
    ...
    'strict' => false,
    ...
]