我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL8.x group_by报错的4种解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL8.x group_by报错的4种解决方法

在我们使用MySQL的时候总是会遇到各种各样的报错,让人头痛不已。其中有一种报错,sql_mode=only_full_group_by,十分常见,每次都是老长的一串出现,然后带走你所有的好心情,如:

 LIMIT 0, 1000 Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tab_test.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 0.063 sec

由于本地安装得mysql版本未报错,但是服务器上的版本报错:

本机版本:

服务器版本:

不知道是8.x哪个版本之后SQL_MODE解除了限制,还是安装与解压版的的区别,目前发现的问题是服务器解压版应该是ini未设置SQL_MODE模式。

出现这样的报错,并不是因为你的代码写得不好,而是因为在MySQL 5.7后,MySQL默认开启了SQL_MODE严格模式,对数据进行严格校验。如果代码中含有group by聚合操作,那么select中的列,除了使用聚合函数之外的,如max()、min()等,都必须出现在group by中。

比如说,出现下面这种情况,就会报错:

select id,aa from tab_test group by aa

如果改成这个样子:

select id,aa from tab_test group by id,aa

或者这个样子:

select aa from tab_test group by aa

就不会报错了。

当然,这样子随意的改动代码,我们可能就无法得到想要的信息了。

我们可以通过以下四种方法,解决该问题:

方法一:直接修改数据库配置

首先,打开数据库,输入

select @@global.sql_mode;

这个时候,就会返回得到以下的信息:(不同电脑返回的信息可能不同)

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

如果里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROUP_BY即可:

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

但是,当我们再一次重新启动数据库时,可能会恢复原样,还是会出现ONLY_FULL_GROUP_BY的报错,这就需要我们再一次修改数据库配置。

那有没有可以永久生效的办法呢?当然有!参考方法二,就可以使修改数据库配置永久生效!

方法二:修改数据库配置(永久生效)

修改配置文件my.ini

在[mysqld]模块下新增一行配置:

sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

运行后重启,即可生效

方法三:使用 any_value() 或 group_concat()

1. any_value():将分到同一组的数据里第一条数据的指定列值作为返回数据。 (any_value()函数就是MySQL提供的用来抑制ONLY_FULL_GROUP_BY值被拒绝的)

select a,any_value(b) from test group by a

2. group_concat():将分到同一组的数据默认用逗号隔开作为返回数据,如下图:

方法四:开动脑筋,修改代码

举个例子,在牛客的第206题中,就出现了类似的情况

SQL206 获取每个部门中当前员工薪水最高的相关信息

题目如下:

示例:

如果我们不用上面的方法,直接用下面这种方式查询,很明显会出现 ONLY_FULL_GROUP_BY 的报错:

select dept_no,d.emp_no,max(s.salary) from dept_emp d join salaries s on d.emp_no = s.emp_nogroup by d.dept_no

我们可以换一种思路:首先查询得到2张表,一张表为员工薪资表 表a,一张表为每个部门最高员工薪资表 表b。然后通过表连接 on d.emp_no = s.emp_no 使这两张表结合,通过on a.salary = b.salary使薪资统一,即这两张表连接后的表的薪资为每个部门的最高员工薪资。最后,再通过一次查询得到每个部门中当前员工薪水最高的相关信息。

select a.dept_no, a.emp_no, b.salaryfrom    (select d.dept_no, s.emp_no, s.salary     from dept_emp as d join salaries as s      on d.emp_no = s.emp_no     ) as a    join    (select d.dept_no, max(s.salary) as salary     from dept_emp as d join salaries as s      on d.emp_no = s.emp_no     group by d.dept_no    ) as b     on a.salary = b.salary and a.dept_no = b.dept_noorder by a.dept_no

希望本篇文章对你有帮助。

来源地址:https://blog.csdn.net/hefeng_aspnet/article/details/129078794

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL8.x group_by报错的4种解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL报错:sql_mode=only_full_group_by 4种解决方法含举例,轻松解决ONLY_FULL_GROUP_BY的报错问题

​ 作为初学者,我们在使用MySQL的时候总是会遇到各种各样的报错,让人头痛不已。其中有一种报错,sql_mode=only_full_group_by,十分常见,每次都是老长的一串出现,然后带走你所有的好心情。 ​​ 出现这样的报错,并不
2023-08-17

MySQL报错:sql_mode=only_full_group_by的4种轻松解决方法(含举例)

目录前言​方法一:直接修改数据库配置方法二:修改数据库配置(永js久生效)方法三:使用 any_value() 或 group_concat()方法四:开动脑筋,修改代码总结前言​作为初学者,我们在使用mysql的时候总是会遇到各种各样的
2023-01-12

MySQL8.x使用GRANT为用户赋权时报错的解决

目录mysql8.x使用GRANT为用户赋权时报错问题描述原因分析解决方案mysql版本:for the right syntax to use near identified by password with grant option总结
2023-04-27

Linux 3.X/4.x/5.x 忘记宝塔面板密码的解决方法

进入sshoDjvZcq 输入以下命令重置密码(把命令最后面的 “testpasswd” 替换成你要改的新密码) 注: 若是debian/ubuntu用户,请使用有root权限的账户去执行这条命令cd /www/
2022-06-04

jQuery/$ is not defined报错的几种解决方法

jQuery/$未定义错误是常见的Web开发难题。解决该错误的方法包括:确保jQuery库已加载并正确引用,检查冲突,使用正确的jQuery版本,排除CDN问题,使用代码优化工具,重置浏览器缓存,联系网站开发人员。遵循这些步骤,您将解决此错误并确保jQuery正常运作。
jQuery/$ is not defined报错的几种解决方法
2024-04-02

Android Studio 报错failed to create jvm error code -4的解决方法

安装完 Android Studio 后启动,却报错如下:代码如下:failed to create jvm error code -4 这一般应是内存不够用所致,解决方法参考如下。 打开 Android Studio 安装目录下的bin目
2022-06-06

ECharts设置x轴刻度间隔的2种解决方法

在初步接触Echarts时,经常遇到设置x轴刻度间隔的问题,这篇文章主要给大家介绍了关于ECharts设置x轴刻度间隔的2种解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

win7报错0x000006d18的两种解决办法

有用户在开机的时候,系统弹出“0x000006d18”的错误提示,虽然不影响系统正常运行,但是很影响心情。下面,跟着懒蛇来学习一下,怎么解决这个错误。 一、手动执行 1、以管理员权限打开cmd窗口2、窗口中输入net
2023-06-17

php $_get报错的解决方法

这篇文章主要介绍php $_get报错的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php $_get报错的解决办法:使用【array_key_exists(key, 数组)】函数来进行判断,其中参数1为要
2023-06-09

Python错误NameError:name 'X' is not defined的解决方法

这篇文章主要给大家介绍了关于Python错误NameError:name ‘X‘ is not defined的解决方法,这是最近工作中遇到的一个问题,文中通过实例代码将解决的方法介绍的非常详细,需要的朋友可以参考下
2023-05-14

安装CentOS 6.x报错"Disk sda contains BIOS RAID metadata"解决方法

今天在安装CentOS6.2的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of any recognized BIOS RA
2022-06-04

编程热搜

目录