报错原因

sql_mode=only_full_group_by 是MySQL严格分组模式:
SELECT 里所有非聚合字段,必须全部写到 GROUP BY 后面
你第56列 dti.nick_name 既没加聚合函数(SUM/MAX/MIN等),又没写在 GROUP BY 中,直接报错。

三种解决方案(从推荐到临时应急)

方案1:规范SQL(推荐,不改数据库配置)

情况A:nick_name 需要分组维度,加到 group by

SELECT
    id,
    nick_name,
    COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id, nick_name; -- 所有普通字段都放这里

情况B:同分组下只取任意一个nick_name,用聚合包裹

不想多分组,就给字段套 MAX() / MIN()

SELECT
    id,
    MAX(nick_name) AS nick_name, -- 聚合处理
    COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id;

方案2:临时关闭 only_full_group_by(仅测试环境,不建议生产)

1)当前会话生效,重启MySQL失效

SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

2)永久修改(my.cnf/my.ini)

找到 sql_mode,删掉 ONLY_FULL_GROUP_BY,重启MySQL服务:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

方案3:使用ANY_VALUE() 兼容写法(MySQL5.7+/8.0推荐)

明确告诉数据库同分组取任意一条该字段值,不用加聚合、不用改group by:

SELECT
    id,
    ANY_VALUE(nick_name) AS nick_name,
    COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id;

举个你报错场景完整示例

错误SQL(会报你这个错):

SELECT id, nick_name, COUNT(*)
FROM cloud_rent.dti
GROUP BY id;

修复后:

SELECT id, ANY_VALUE(nick_name) AS nick_name, COUNT(*)
FROM cloud_rent.dti
GROUP BY id;

补充说明

  1. 生产环境不要关闭 only_full_group_by,该模式是防止分组查询逻辑混乱、数据错乱;
  2. 多表联查时,所有未聚合的查询字段都要遵守规则,不止单表;
  3. 如果是MyBatis/JDBC后台代码,优先改SQL语句,不要动数据库全局配置。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐