#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
- Mysql 5.7.9 运行查询没有任何问题,但 mysql 5.7.12
显示上面的错误 你能帮我解决一下吗
您必须通过任何 NOT IN
group by
子句进行聚合。
所以,有两个选项...添加Credit_Initial和Disponible_v到group 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
上工作
所以,成功的步骤:
sudo vim /etc/mysql/conf.d/mysql.cnf
滚动到文件底部复制粘贴
[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
到文件底部
- 保存并退出输入模式
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,
...
]
我的查询:
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 显示上面的错误 你能帮我解决一下吗
您必须通过任何 NOT IN
group by
子句进行聚合。
所以,有两个选项...添加Credit_Initial和Disponible_v到group 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
上工作所以,成功的步骤:
sudo vim /etc/mysql/conf.d/mysql.cnf
滚动到文件底部复制粘贴
[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
到文件底部
- 保存并退出输入模式
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_BYOpen 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,
...
]