针对Mysql5.7及以上版本中出现的ONLY_FULL_GROUP_BY报错,我们可以采取以下的解决方法:
方法一:修改系统参数
- 使用管理员账号登录Mysql服务器
- 运行命令“show variables like 'sql_mode';”,查看当前的sql_mode值,可能会输出类似“ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION”的内容
- 将sql_mode参数中的ONLY_FULL_GROUP_BY选项删除或注释掉
- 如果是通过命令行客户端连接,可以在连接时指定参数的值:mysql -uroot -p -hlocalhost --init-command="SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';"
-
如果是通过配置文件设置参数,则在my.cnf或my.ini文件添加一行内容:sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
-
重启Mysql服务器
方法二:修改SQL语句
如果你不想修改系统参数,也可以在SQL语句中指定GROUP BY的字段,如下所示:
SELECT user_id, MAX(salary) FROM staff GROUP BY user_id;
例如,原来的SQL语句可能是这样的:
SELECT user_id, MAX(salary) FROM staff;
会报错,此时你可以使用以下的SQL语句:
SELECT user_id, MAX(salary) FROM staff GROUP BY user_id;
这样就可以避免报错了。
示例说明:
- 假设我们有一个表student,记录了学生们的学号、姓名和年龄等信息。现在需要查询每个学生的最高分数,可以使用如下的SQL语句:
SELECT id, name, MAX(score) FROM student;
按照上面的方法一,直接将系统参数中的ONLY_FULL_GROUP_BY选项删除或注释掉,即可避免报错。
- 假设我们有一个表order,记录了订单中商品的名称、价格和数量等信息。现在需要查询每个商品的总销售量,可以使用如下的SQL语句:
SELECT name, SUM(price * count) FROM order;
按照上面的方法二,指定GROUP BY的字段,如下所示:
SELECT name, SUM(price * count) FROM order GROUP BY name;
这样就可以避免报错了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法 - Python技术站