MySQL GROUP BY后不能使用原表的字段名

当在MySQL中使用GROUP BY时,无法直接引用未聚合的原表字段。这属于SQL模式的一部分,如严格模式。解决方法包括临时修改sql_mode为非严格模式,或者在配置文件my.ini中永久设置sql_mode,之后重启MySQL服务。

SQL 模式主要分两类:语法支持类和数据检查类,常用的如下

语法支持类    
    ONLY_FULL_GROUP_BY

      对于 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的

    ANSI_QUOTES

      启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 ` 一样。设置它以后,update t set f1="" ...,会报 Unknown column ‘’ in field list 这样的语法错误

    PIPES_AS_CONCAT

      将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle数据库是一样的,也和字符串的拼接函数 CONCAT() 相类似

    NO_TABLE_OPTIONS
      使用 SHOW CREATE TABLE 时不会输出MySQL特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑

    NO_AUTO_CREATE_USER

      字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用 GRANT ... ON ... TO dbuser 顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户

数据检查类   
    NO_ZERO_DATE

      认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关

      1、如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允许且只显示warning;

      2、如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,’0000-00-00’ 允许但显示warning;如果没有设置NO_ZERO_DATE,no warning,当做完全合法的值;

      3、NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法;

    NO_ENGINE_SUBSTITUTION

      使用 ALTER TABLE 或 CREATE TABLE 指定 ENGINE 时, 需要的存储引擎被禁用或未编译,该如何处理。启用 NO_ENGINE_SUBSTITUTION 时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning

    STRICT_TRANS_TABLES

      设置它,表示启用严格模式。注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE 出现少值或无效值该如何处理:

      1、前面提到的把 ‘’ 传给int,严格模式下非法,若启用非严格模式则变成 0,产生一个warning;

      2、Out Of Range,变成插入最大边界值;

      3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值;

解决方法:

-- 查看 sql_mode
SELECT @@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;

set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';

就可以了
还有一种方法是找到你的my.ini文件
在里面新添加sql_mode 或修改原来的sql_mode

[mysql]
default-character-set=utf8
[mysqld]
port = 3306
basedir=D:\mysql-5.7.24-winx64\bin
datadir=D:\mysql-5.7.24-winx64\data
max_connections=200
# 这个是重点,sql_mode后面可以什么都不加不去限制他是什么模式
sql_mode=
character-set-server=utf8

然后重启你的mysql服务就ok了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值