MySQL执行GROUP BY查询触发only_full_group_by错误如何解决
报错原因分析
这个报错是MySQL的only_full_group_bySQL模式触发的校验失败,该模式是MySQL 5.7及之后版本的默认开启规则,要求满足两个条件之一:
- SELECT查询列表里的列,必须全部出现在GROUP BY子句中
- SELECT查询列表里未出现在GROUP BY的列,必须被聚合函数(
MAX()/MIN()/COUNT()/SUM()等)包裹
你当前的SQL用了SELECT *,返回的列包含message_id等大量不在GROUP BY子句中的字段,也没有使用聚合函数,因此不符合规则触发报错。
解决方案
方案1:调整SQL语句适配规则(最推荐)
根据你的业务需求选择对应写法:
场景1:仅需要每个message_thread_code分组的统计值或指定字段
只保留GROUP BY字段和聚合后的字段,示例:
SELECT `message_thread_code`, COUNT(*) AS unread_count, MAX(`send_time`) AS latest_send_time FROM `message` WHERE `read_status` =0 AND `reciever` = 'admin-1' GROUP BY `message_thread_code`
场景2:需要每个message_thread_code分组下的完整单条消息记录(比如最新一条未读消息)
用窗口函数实现,示例:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY `message_thread_code` ORDER BY `send_time` DESC) AS rn FROM `message` WHERE `read_status` =0 AND `reciever` = 'admin-1' ) t WHERE t.rn = 1
方案2:关闭only_full_group_by模式(不推荐,仅做临时调试用)
临时生效(重启MySQL后失效)
执行SQL命令:
SET GLOBAL sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''); SET SESSION sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');
永久生效
修改MySQL配置文件(Linux下为my.cnf,Windows下为my.ini),在[mysqld]段下添加如下配置后重启MySQL:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
内容的提问来源于stack exchange,提问作者L3DMaN
相关产品推荐
相关产品推荐

