大数据(BD社区)-专业IT技术社区

?找回密码
?365bet开户娱乐

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 434|回复: 1
打印 上一主题 下一主题

MYSQL升级后GROUP BY语句出错解决方法

[复制链接]

70

主题

73

帖子

389

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
389
跳转到指定楼层
楼主
发表于 2018-5-3 14:44:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引言

实践Qt+MySQL的小项目《餐饮信息服务系统》中,使用

  1. select cid,cname,count(fname) from foodorder.orderlist group by cid
复制代码

报错:

  1. 数据库查询出错:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'foodorder.orderlist.cname' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by QMYSQL: Unable to execute query
复制代码

解决

MySQL 5.7默认的SQL mode包含如下:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION。

升级MYSQL5.7是为了更好的性能,据我猜测,MYSQL5.7对sql_mode的限制,也是为了更好的查询性能。所以如果在开发阶段,如果要使用mysql5.7版本建议大家阅读一下5.7的文档,然后将自己的sql写的更严谨,尽量少用select * ,只查出自己想要的数据列即可。
mysql 5.6,居然可以不像oracle那样,group by中的列一定要出现在select中,除非强制sqlmode中使用ONLY_FULL_GROUP_BY,但5.7中好像默认使用ONLY_FULL_GROUP_BY了

查询mysql服务器版本
  1. select @@version;
复制代码

查看sql_mode
  1. SELECT @@sql_mode;
  2. select @@GLOBAL.sql_mode;
  3. select @@SESSION.sql_mode;
复制代码

修改sql_mode
  1. SET GLOBAL sql_mode = '';
复制代码

  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';
复制代码



0

主题

3

帖子

18

积分

禁止发言

积分
18
沙发
发表于 2018-7-10 14:59:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 365bet开户娱乐

本版积分规则

Archiver|手机版|小黑屋|BD Inc. ( 京ICP备16038882号-2 )

GMT+8, 2019-9-23 10:17 , Processed in 0.025115 second(s), 16 queries .

Powered by Discuz! X3.4

? 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表