ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql group by 排序错误 only_full_group_by

2022-08-07 11:03:40  阅读:209  来源: 互联网

标签:full group mysql only sql GROUP column1 column2


问题描述

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with **sql_mode=only_full_group_by**

原因 是在5.7及上8.0版本的mysql的model默认都会有这个

ONLY_FULL_GROUP_BY

含义 sql中select后面的字段必须出现在group by后面,或者被聚合函数包裹,不然会抛出上面的错误 如以下sql

select A.column1, A.column2 from table as A group by column1 //会因为ONLY_FULL_GROUP_BY的缘故抛出上面错误

问题解决

思路一 (非必要不建议去修改 配置文件 )

既然是这个模式限制的问题 我们可以修改该模式,找到配置文件 修改配置即可。

vim /etc/mysql/my.cnf //windows的话需要去找my.ini文件

文件名如上所示,但是地址可能得看具体环境了

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8 
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=%MYSQL_HOME%
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 设置模式
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir = D:\mysql-5.7.27-winx64\data

注意这里的sql_mode 是配置在[mysqld]下面的
然后就是重启mysql服务

思路二

我们得承认这个模式是很有意义的。而我们又想实现如下sql的效果

select A.column1, A.column2 from table as A group by column1 

首先我们得理解我们写的上面的sql的含义 按column1进行分组 那么结果就是这个组内的cloumn1都是相同的,但是column2却没有限制,也就是说可能相同 也可能不同,那么数据库不知道column2该返回什么值给你

那么我们有两种方案

1.在group by后面追加上column2就可以了,意义相当于按照 由column1和column2拼接成的联合字段进行分组

select A.column1, A.column2 from table as A group by column1 , column2

2.或者在内查询里只查询分组的字段, 各位可以参考如下形式

SELECT A.column1, A.column2 FROM TABLE A JOIN ( SELECT max(id) id, column1 FROM TABLE b GROUP BY column_1 ) C ON A.column1 = C.column1 and C.id = A.id

补充

  1. MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
  2. ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值
  3. MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝
  4. any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据

另外 还有一个通俗的例子,好比
对于上述的报错信息,我的理解是select字段里包含了没有被group by条件唯一确定的字段fields。(也就是同一个column有多个结果,引擎不知道取那个)
假如一个表内有多个国家,比如

name country
张三 魏国
李四 魏国
王五 蜀国
霸道 蜀国
橘子 蜀国
蛋糕 吴国

我们想要查询有多少国家,分别为…
可以

select country from 表名 group by country;

但是如果说我们这样

select name,country from 表名 group by country;

因为执行group_by语句实际上把同一组内多行纪录合并成一行,同一个国家name并不相同,搜索引擎不知道该返回哪一条,所以认为这样的sql是武断的(arbitrary).

解决办法就是上面的解决办法,若非必要还是不要去掉,出现错误最大可能是sql语句本身存在问题.

参考有:

原文链接:https://blog.csdn.net/study_in/article/details/92625397

原文链接:https://blog.csdn.net/qq_34637782/article/details/101029487

标签:full,group,mysql,only,sql,GROUP,column1,column2
来源: https://www.cnblogs.com/HHbJ/p/16558624.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有