You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:54:04