mysql错误-1055 - Expression #1 of SELECT list is not in GROUP BY clause 解决方案

news2024/11/14 21:35:14

目录

  • 业务场景
  • 发现问题
    • 表结构
    • 表数据
    • sql查询
  • 分析问题
    • 验证
  • 解决问题
    • 方案一
    • 方案二
    • 方案三
  • 注意事项

业务场景

当遇到数据库重复数据,就要将数据进行分组,取其中一条来展示,此时就要用到group by语句。
但当mysql的版本高于5.7时,在执行group by时,select的字段不属于group by的字段的话,就会报错。报错信息如下:

1055 - Expression #1 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
>时间: 0.233s

发现问题

表结构

CREATE TABLE `t_iov_help_feedback` (
  `ID` INT(11) NOT NULL  AUTO_INCREMENT COMMENT '主键ID',
  `USER_ID` INT(255) DEFAULT NULL  COMMENT '用户ID',
  `problems` VARCHAR(255) DEFAULT NULL COMMENT '问题描述',
  `last_updated_date` DATETIME DEFAULT NULL COMMENT '最后更新时间',
  PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

表数据

INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (1, 1, '时间比较小', '2023-06-15 16:53:25');
INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (2, 2, '时间小', '2023-06-15 16:53:57');
INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (3, 3, '写错了', '2023-06-15 16:54:26');
INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (4, 1, '不合格', '2023-06-15 16:54:52');
INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (5, 2, '合格', '2023-06-15 16:55:22');
INSERT INTO `test`.`feedback` (`id`, `user_id`, `problems`, `last_updated_date`) VALUES (6, 4, '非常有用', '2023-06-15 16:56:26');

在这里插入图片描述

sql查询

1)查询 GROUP BY 的字段(正常

SELECT user_id FROM feedback GROUP BY user_id;

在这里插入图片描述
2)查询使用聚合函数(正常

SELECT MAX(id),user_id FROM feedback GROUP BY user_id;

在这里插入图片描述
3)查询非group by字段(异常

SELECT id,user_id FROM feedback GROUP BY user_id;

在这里插入图片描述
错误描述:

“错误代码:1055,SELECT列表的表达式 #1 不在GROUP BY子句中,并且包含非聚合
列’test.feedback.id’,它在功能上不依赖于GROUP BY子句中的列; 这与sql_mode =
only_full_group_by不兼容”

分析问题

1)原理层面

这个错误会发生在mysql 5.7 版本及以上版本mysql 5.7版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多程序员从5.6升级到5.7时,为了语法兼容,大部分会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

2)sql层面

在sql执行时,出现该原因,简单来说就是:
由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,
并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法。

验证

1)查询数据库版本

SELECT VERSION();

在这里插入图片描述
显然,数据库版本5.7.29大于了5.7。

2)查看sql_mode

select @@GLOBAL.sql_mode;

在这里插入图片描述
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,NO_ENGINE_SUBSTITUTION

显然,sql_mode开启了ONLY_FULL_GROUP_BY属性。

解决问题

方案一

使用ANY_VALUE()包含非group by 字段

SELECT ANY_VALUE(id),user_id FROM feedback GROUP BY user_id;

在这里插入图片描述
由此可见,问题轻松解决!

ANY_VALUE()函数说明

MySQL有any_value(field)函数,它主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝。
这样sql语句不管是在ONLY_FULL_GROUP_BY模式关闭状态还是在开启模式都可以正常执行,不被mysql拒绝。
any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。
官方有介绍,地址:https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

方案二

通过sql语句暂时性修改sql_mode,即去掉ONLY_FULL_GROUP_BY属性

SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据库下执行:

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

这种方案有个问题:重启mysql数据库服务之后,ONLY_FULL_GROUP_BY还会出现,所以这只是暂时性的。

方案三

通过配置文件永久修改sql_mode
1)Linux下修改配置文件
编辑my.cnf文件,文件地址一般在:/etc/my.cnf,/etc/mysql/my.cnf
找到sql_mode,将其中的ONLY_FULL_GROUP_BY属性去掉,如果没有sql_mode配置,就在 [mysqld]下面追加一下即可。

sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

保存之后一定要重启mysql

service mysql restart

2)window下修改配置文件
找到mysql安装目录,用记事本直接打开my.ini文件
同理,追加sql_mode,如下:

sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在这里插入图片描述

注意事项

永久修改sql_mode后,不管是linux还是windows都要重启mysql服务才会生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32设备驱动-TCA9548A-I2C多路复用器驱动

TCA9548A-I2C 多路复用器驱动 文章目录 TCA9548A-I2C 多路复用器驱动1、TCA9548A介绍2、硬件准备3、软件准备4、驱动实现4.1 TCA9548A总线复用实现4.2 驱动多个OLED显示屏4.3 驱动多个BME280传感器在本文中,将介绍如何使用 TCA9458A I2C 多路复用器扩展 I2C 总线端口。 如果你…

【Python 基础篇】Python 列表及列表常用函数

文章目录 一. 什么是列表二. 列表的创建和访问2.1 创建列表2.2 访问列表元素 三. 列表的操作3.1 修改列表元素3.2 列表的添加和删除元素3.2.1 添加元素3.2.2 删除元素 3.3 列表的排序3.4 判断元素是否在列表中 四. 列表的常用函数和方法五. 总结 一. 什么是列表 在Python中&am…

CLO-GitHub网站注册登录

一、GitHub GitHub是一个面向开源及私有软件项目的托管平台,仅支持Git作为唯一的版本库格式进行托管。 二、登录官网 网站:https://github.com/ 2.1 注册Sign up Enter your Email(输入邮箱地址)->Continue-> ->Create a…

HCIP网络笔记分享——VLAN及MPLS多标签协议交换

第三部分 HCIA回顾一、MPLS多协议标签交换1、标签交换2、静态LSP搭建3、LDP协议4、本地LDP会话建立的过程 二、MPLS VPN的配置使用MPLS VPN 三、实际情况配置1、VLAN第一步:创建VLAN第二步:将接口划入VLAN第三步:配置trunk干道 2、U/T标记3、…

AI绘画基于 Kaggle 10 分钟搭建 Stable Diffusion(保姆级教程)

AI绘画基于 Kaggle 10 分钟搭建 Stable Diffusion(保姆级教程) 一、引言二、安装教程1. 注册 Kaggle2. Edit My Copy3. 进行手机号的验证4. 打开 “internet off” 开关,并选择显卡5. 开启 session,运行脚本 三、主界面介绍四、注…

车辆派遣管理系统——需求

文章目录 一、背景二、用户的特点三、系统范围四、系统体系结构系统总体架构描述: 五、数据库设计E-R图数据字典 六、工作量估算七、项目燃尽图 一、背景 车辆派遣管理系统是提供对车辆派遣高效管理的系统,自动生成结算结果;可以有效节约车辆…

侯捷——1.C++面向对象高级开发 总结

侯捷——1.C面向对象高级开发 总结 前面的几个视频没有总结,等以后有空再补 7. Class with pointer member(s) —— string 类 该string类,内含指针,所以要自己写构造函数和析构函数,不能使用默认的构造函数和析构函数。 包含…

MHA部署

目录 高可用集群MHA 环境准备 设置服务器免密通联 修改主机名和hosts文件(四台) 四台服务器相同操作 四台服务器相同操作-关闭防火墙 四台服务器-免密配置-生成密钥 四台服务器-免密配置-复制密钥 将authorized_keysau文件发送给node2/3/4 测试是否免密登陆其他主机 …

0018-TIPS-pawnyable : NULL-Pointer-Dereference

原文 NULL Pointer Dereference 题目下载 环境宽松限制 启动选项中可以看到,SMAP在被攻击的机器上被禁用。除非禁用 SMAP,否则无法利用本章中讨论的 NULL 指针取消引用。 还可以尝试启动该内核并输入以下命令: $ cat /proc/sys/vm/mmap_mi…

chatgpt赋能python:Python文件打包:了解基本概念和步骤

Python文件打包: 了解基本概念和步骤 Python开发现在已经越来越成为了一种主流开发方式,然而,当我们的代码在多个环境中运行时,我们可能会遇到各种问题。Python文件打包就起到了非常重要的作用,它可以把我们的代码和环…

java ArrayList()常用详解

文章目录 java ArrayList()常用详解构造方法构造一个具有指定初始容量的空列表构造具有指定初始容量的空列表 常用方法指定的元素追加到此列表的末尾泛型 用来约束集合中存储数据的数据类型在次列表中的指定位置插入指定的元素返回此列表中指定位置的元素删除该列表中指定位置的…

spring 解决循环依赖

spring 解决循环依赖 1、什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图: spring的单例对象的初始化主要…

DAC0832

芯片简介: DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式。D/A转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放…

Redmi Book Pro 15 2022 笔记本电脑更换硬盘总结

我的电脑型号是Redmi Book Pro 15 2022 锐龙版,早在6月15日磁盘空间就告急了,正好遇上618就打算更换硬盘,直到今天更换成功,特此来记录一下 目录 一、更换硬盘前准备工作二、更换硬盘三、硬盘迁移以及分区四、总结 本文的更换过程…

实验记录之——mac用visual studio code配置opencv

安装opencv 用Homebrew安装opencv brew install wget brew install cmake brew install opencv看来都安装过了hhh 通过下面命令再次检测安装的opencv版本 brew info opencv全部都打绿色的勾,应该就是都安装完了。 Vscode配置c/c环境 配置cpp项目可以看下面链接…

第一天,PyTorch张量的运算

文章目录 一、说明二、张量的常用运算1. 索引和切片(与numpy类似)2. 通过torch.cat来进行连接张量3. 矩阵运算和算数运算1. 在PyTorch中mul与matmul和的区别2. 矩阵运算和算数运算的示例 4. 聚合张量中的所有值5. 给所有元组增加1,使用add_&a…

Chrome 开发者调试常用工具

Chrome调试工具介绍 ①②③④⑤⑥⑦⑧⑨⑩ 一、Elements-元素 选项说明 styles filter搜索框:查找过滤样式, 包括class名当前选中的元素 查看其伪类效果已经样式给当前选中元素添加class名可以把当前元素class名或者id, 按照css层级添加一…

C语言:获得月份天数(多组输入)

题目: 描述 KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。 输入描述: 多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。 输出描述&#xff…

chatgpt赋能python:Python整除判断——一个不可缺少的技能

Python整除判断——一个不可缺少的技能 Python是一门广泛应用于科学计算、人工智能等多个领域的编程语言。在Python中,整除判断是一个非常基础但却不可或缺的技能。本篇文章将从基础开始介绍如何判断是否整除,以及如何在实际应用中使用整除判断。 整除…

PB9与Navicat Premium 16同时连接Oracle11g的连接问题

PB9与Navicat Premium 16同时连接Oracle11g的连接问题。 电脑安装的是win64_11gR2_database就是64的。 Navicat Premium 16其实是等oracle安装好后直接就能连了毫无问题。 pb9呢。因为需要32驱动的oci.dll,所以需要下载instantclient-basic-win32-11.1.0.7.0解压…