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

作者:Lenix 时间:2024-01-16 12:17:50 

发现问题

最近在将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种方法。

来源:http://blog.p2hp.com/archives/4732

标签:mysql5.7,groupby,查询
0
投稿

猜你喜欢

  • python 内置模块详解

    2023-09-08 00:55:55
  • Go处理json数据方法详解(Marshal,UnMarshal)

    2024-02-06 11:47:24
  • SQL触发器实例讲解

    2024-01-24 13:46:55
  • python使用re模块爬取豆瓣Top250电影

    2023-10-11 17:28:38
  • Python入门基础之变量及字符串

    2023-08-08 06:10:11
  • python 实现目录复制的三种小结

    2023-09-01 12:17:20
  • Python绘图模块 turtle案例代码

    2022-12-16 01:28:10
  • 理解绝对定位和相对定位布局

    2009-03-19 13:53:00
  • python解决OpenCV在读取显示图片的时候闪退的问题

    2022-04-16 16:29:48
  • 基于mysq字段选择的详解

    2024-01-23 20:11:20
  • RedHat 9.0下用rpm包安装mysql

    2008-11-22 12:28:00
  • python中时间、日期、时间戳的转换的实现方法

    2022-03-20 13:37:12
  • pycharm运行出现ImportError:No module named的解决方法

    2022-09-10 18:06:23
  • python 中的@property的用法详解

    2023-03-03 16:57:57
  • python 顺时针打印矩阵的超简洁代码

    2023-03-25 14:03:52
  • python脚本替换指定行实现步骤

    2022-03-18 16:53:28
  • 如何让利用Python+AI使静态图片动起来

    2022-06-06 08:15:31
  • Python内置数据结构列表与元组示例详解

    2021-08-17 21:28:14
  • CSS Hack经验总结

    2008-05-01 13:13:00
  • Django 浅谈根据配置生成SQL语句的问题

    2023-05-10 07:48:23
  • asp之家 网络编程 m.aspxhome.com