Mysql 错误代码: 1055错误代码:与sql_mode = only_full_group_by不兼容

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdays83892469/article/details/87926886

错误代码: 1055

Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘xxxx’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因

在MySQL5.7.5后,默认开启了ONLY_FULL_GROUP_BY,所以导致了之前的一些SQL无法正常执行,其实,是我们的SQL不规范造成的,因为group by 之后,返回的一些数据是不确定的,所以才会出现这个错误。

解决方案

一、禁用ONLY_FULL_GROUP_BY
Linux环境
1.登录进入MySQL,linux登录的:mysql -u username -p ,然后输入密码,输入SQL:show variables like ‘%sql_mode’;
在这里插入图片描述
2. 编辑my.cnf文件,文件地址一般在:/etc/my.cnf,/etc/mysql/my.cnf,找到sql-mode的位置,去掉ONLY_FULL_GROUP_BY,然后重启MySQL;有的my.cnf中没有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,注意要加入到[mysqld]下面,加入到其他地方,重启后也不生效,具体的如下图:
在这里插入图片描述
3.修改成功后重启MySQL服务,service mysql restart,重启好后,再登录mysql,输入SQL:show variables like ‘%sql_mode’; 如果没有ONLY_FULL_GROUP_BY,就说明已经成功了。
在这里插入图片描述
Windows下解压版Mysql
去掉ONLY_FULL_GROUP_BY这个配置,需要更改my.ini配置文件中的配置,如果没有则自己创建(一般安装好后按照教程就会创建好这个文件,该配置文件放到mysql安装目录根目录下),配置内容如下:

[mysqld]
#去掉"ONLY_FULL_GROUP_BY"的配置 这个一定写在[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安装目录以及mysql存放数据的目录
basedir=D:\安装目录\mysql-5.7.21
datadir=D:\安装目录\mysql-5.7.21\data
port=3306
character-set-server=utf8
[client]
port=3306
character-set=utf8

二、 修改SQL,因为出现这个问题,基本都是因为这个问题造成的,不确定返回字段可以使用ANY_VALUE(column_name)。
根据mysql文档,“如果name不是t的主键或唯一的NOT NULL列,则此查询无效。在这种情况下,不可以推断出功能依赖性并发生错误:“

SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by

修改ANY_VALUE(‘my_column_name’) my_column_name “在这种情况下,MySQL忽略每个名称组中的地址值的不确定性并接受查询。” 使用ANY_VALUE()来引用地址:

修改后语句如下
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; 

最后附自己修改项目中的一条语句供大家参考

 #表结构如下所示
  DROP TABLE IF EXISTS `message`;
  CREATE TABLE `message` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `from_id` INT NULL,
    `to_id` INT NULL,
    `content` TEXT NULL,
    `created_date` DATETIME NULL,
    `has_read` INT NULL,
    `conversation_id` VARCHAR(45) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `conversation_index` (`conversation_id` ASC),
    INDEX `created_date` (`created_date` ASC))
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = utf8; 
#Mysql5.7.5之前语句 
SELECT from_id , to_id, content, has_read, conversation_id, created_date,COUNT(id) FROM ( 
	SELECT id,from_id,to_id,content,created_date,has_read,conversation_id FROM message
           WHERE from_id=12 OR to_id=12 ORDER BY created_date DESC) 
           AS tt GROUP BY conversation_id
           ORDER BY created_date
           DESC LIMIT 0, 10;  
#修改后
SELECT any_value (from_id) , any_value (to_id), any_value (content), any_value (has_read), any_value (conversation_id), any_value(created_date),any_value(COUNT(id)) AS id FROM ( 
	SELECT id,from_id,to_id,content,created_date,has_read,conversation_id FROM message
           WHERE from_id=12 OR to_id=12 ORDER BY created_date DESC) 
           AS tt GROUP BY conversation_id
           ORDER BY any_value(created_date)
           DESC LIMIT 0, 10; 
#  如果是以前的老项目重构,保持列名一致就不需要修改原程序,通过起别名适配 如下所示
SELECT any_value (from_id) AS  from_id, any_value (to_id) AS to_id, any_value (content) AS content, any_value (has_read) AS has_read, 
	any_value (conversation_id) AS conversation_id, any_value(created_date) AS created_date,any_value(COUNT(id)) AS id FROM ( 
	SELECT id,from_id,to_id,content,created_date,has_read,conversation_id FROM message
           WHERE from_id=12 OR to_id=12 ORDER BY created_date DESC) 
           AS tt GROUP BY conversation_id
           ORDER BY any_value(created_date) 
           DESC LIMIT 0, 10;

参考博客:
https://www.cnblogs.com/tygtyg/p/9895481.html
https://www.jianshu.com/p/a430fa1deb85
https://cloud.tencent.com/developer/ask/198993/answer/310023

猜你喜欢

转载自blog.csdn.net/wdays83892469/article/details/87926886