MySQL(本机或云数据库) 查询报错SELECT list is not in GROUP BY clause and contains nonaggregated最可靠解决办法

报错原文

1
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.month_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.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)

最有效的解决办法

  1. 修改MySQL配置文件my.ini(安装路径/my.ini),还有可能是你没有这个配置文件,那就需要自己在安装根目录下新建一个my.ini配置文件,文件内容参考如下,如果你有这个配置文件,这一步直接跳过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[mysql]
default-character-set=utf8

[mysqld]
port=3306
default_authentication_plugin=mysql_native_password
basedir=C:/MySQL8.0.12/
datadir=C:/MySQL8.0.12/data/
character-set-server=utf8
default-storage-engine=MyIsam
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
innodb_buffer_pool_size=64M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=120
innodb_log_buffer_size=4M
innodb_log_file_size=256M
interactive_timeout=120
join_buffer_size=2M
key_buffer_size=32M
log-error=C:/MySQL8.0.12/data
log_error_verbosity=1
max_allowed_packet=16M
max_connections=100
max_heap_table_size=64M
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=32M
read_buffer_size=512kb
read_rnd_buffer_size=4M
server_id=1
skip-external-locking=on
sort_buffer_size=256kb
table_open_cache=256
thread_cache_size=16
tmp_table_size=64M
wait_timeout=120

[client]
port=3306
default-character-set=utf8
  1. 需要设置行的模式,需要注意不是添加在文件的最后一行,见下图,而是添加在【mysqld】类别下
1
2
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

image-20211214111345471

  1. 如果是MySQL8,设置模式是是没有 NO_AUTO_CREATE_USER这个模式的请看清楚

如果是网络服务器数据库怎么修改?

因为网络数据库服务器,你是没有权限查看安装目录这些文件的,所以只要通过其他方式进行修改,网上的什么set @@....是错误的,,即便修改成功,重启服务器后又复原了。

  1. 登录你的网络云数据库服务器(就是数据库配置的控制中心,我以阿里云为例,其他云平台类似)

image-20211214112833157

  1. 点击右边的参数设置

image-20211214112931442

  1. 添加模式设置
1
2
下图第2步设置的内容(复制去掉这句话)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

image-20211214113144043

最后重启数据库服务器即可