Mysql升级到5.7后遇到的group by查询问题解决

 更新时间:2017年09月13日 10:28:40   作者:Lenix  
这篇文章主要给大家介绍了关于Mysql升级到5.7后遇到的group by查询问题的解决方法,文中通过示例代码介绍的非常详细,对同样遇到这个问题的朋友们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

发现问题

最近在将mysql升级到mysql 5.7后,进行一些group by 查询时,比如下面的

SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20

就会报如下错误:

SELECT list is not in GROUP BY clause and contains nonaggregated column ‘news.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.

原因分析

原因是mysql 5.7 模式中。默认启用了ONLY_FULL_GROUP_BY。

ONLY_FULL_GROUP_BY是MySQL提供的一个sql_mode,通过这个sql_mode来提供SQL语句GROUP BY合法性的检查。

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

this is incompatible with sql_mode=only_full_group_by这句话提示了这违背了mysql的规则,only fully group by,也就是说在执行的时候先分组,根据查询的字段(select的字段)在分组的内容中取出,所以查询的字段全部都应该在group by分组条件内;一种情况例外,查询字段中如果含有聚合函数的字段不用包含在group by中,就像我上面的count(id)。

后来发现Order by排序条件的字段也必须要在group by内,排序的字段也是从分组的字段中取出。 不明白的可以去看一下。

解决办法:

1.set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

去掉ONLY_FULL_GROUP_BY即可正常执行sql.

2. 不去ONLY_FULL_GROUP_BY, 时 select字段必须都在group by分组条件内(含有函数的字段除外)。(如果遇到order by也出现这个问题,同理,order by字段也都要在group by内)。

3.利用ANY_VALUE()这个函数 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

This function is useful for GROUP BY queries when the ONLY_FULL_GROUP_BY SQL mode is enabled, for cases when MySQL rejects a query that you know is valid for reasons that MySQL cannot determine. The function return value and type are the same as the return value and type of its argument, but the function result is not checked for the ONLY_FULL_GROUP_BY SQL mode.

如上面的sql语句可写成

SELECT ANY_VALUE(id)as id,ANY_VALUE(uid) as uid ,ANY_VALUE(username) as username,ANY_VALUE(title) as title,ANY_VALUE(author) as author,ANY_VALUE(thumb) as thumb,ANY_VALUE(description) as description,ANY_VALUE(content) as content,ANY_VALUE(linkurl) as linkurl,ANY_VALUE(url) as url,ANY_VALUE(group_id) as group_id,ANY_VALUE(inputtime) as inputtime, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY ANY_VALUE(inputtime) DESC LIMIT 20

我选用的是第3种方法。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Mysql官方性能测试工具mysqlslap的使用简介

    Mysql官方性能测试工具mysqlslap的使用简介

    mysqlslap随着MySQL安装的时候就自动安装好了,而且 mysqlslap 把很多的自定义测试的功能封装到了外部,使用者只需要在外部提供 SQL 语句的脚本就可以自定义测试语句,本文将简单介绍该工具的使用
    2021-05-05
  • Mysqli基础知识

    Mysqli基础知识

    本文给大家讲述的是Mysqli的基础知识,非常的浅显易懂,有需要的小伙伴就可以参考下。
    2015-07-07
  • MySQL如何使用union all获得并集排序

    MySQL如何使用union all获得并集排序

    这篇文章主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Mysql主从复制与读写分离图文详解

    Mysql主从复制与读写分离图文详解

    这篇文章主要给大家介绍了关于Mysql主从复制与读写分离的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • idea中使用mysql的保姆级教程(超详细)

    idea中使用mysql的保姆级教程(超详细)

    我们开发时经常需要用到一些客户端去访问数据库查询、更新数据等操作,下面这篇文章主要给大家介绍了关于idea中使用mysql的保姆级教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 利用Sqoop实现MySQL数据导入Hive的全流程

    利用Sqoop实现MySQL数据导入Hive的全流程

    在大数据领域中,MySQL 和 Hive 是两种常见的存储工具,MySQL 适合事务处理,而 Hive 则是用于离线数据分析的利器,本文将全面讲解如何使用 Sqoop 将 MySQL 数据导入 Hive 的完整流程,包括环境配置、具体操作步骤以及最佳实践和常见问题解决方案,需要的朋友可以参考下
    2024-12-12
  • MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据的100%恢复,目的是尽可能多的恢复,下面是具体的操作方法
    2025-03-03
  • mysql 有关“InnoDB Error ib_logfile0 of different size”错误

    mysql 有关“InnoDB Error ib_logfile0 of different size”错误

    mysql 有关“InnoDB Error ib_logfile0 of different size”错误的解决方法,需要的朋友可以参考下。
    2011-06-06
  • MySQL中USING 和 HAVING 用法实例简析

    MySQL中USING 和 HAVING 用法实例简析

    这篇文章主要介绍了MySQL中USING 和 HAVING 用法,结合实例形式简单分析了mysql中USING 和 HAVING的功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-08-08
  • SQL 中 HAVING 常见的使用方法

    SQL 中 HAVING 常见的使用方法

    这篇文章主要介绍了SQL中HAVING常见的使用方法,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论