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

MySQL GROUP BY报错求助:非聚合列不符合only_full_group_by模式要求

解决MySQL GROUP BY与only_full_group_mode冲突问题

错误原因

你遇到的错误是因为MySQL启用了only_full_group_by严格模式,该模式要求:SELECT列表中的所有非聚合列,要么必须出现在GROUP BY子句中,要么与GROUP BY中的列存在函数依赖关系(比如GROUP BY的列是对应表的主键,其他列能被其唯一确定)。

你的SQL中GROUP BY的是web_games.game_id,但category_name_tr、user_name等列既不在GROUP BY中,也无法被game_id唯一确定(比如同一个游戏可能有多个用户评分记录),因此触发了这个错误。

可行解决方案

方案1:调整GROUP BY子句,包含所有非聚合列

将SELECT里所有非聚合的字段都添加到GROUP BY中,确保逻辑上的一致性:

SELECT game_id, game_name_tr, game_name_en, game_url_tr, game_url_en, game_small_image, category_name_tr, category_name_en, category_url_tr, category_url_en, user_name, user_url, score_point 
FROM web_game_scores
INNER JOIN web_users ON web_game_scores.score_user_id=web_users.user_id 
INNER JOIN web_game_categories ON web_game_scores.score_game_category_id=web_game_categories.category_id
INNER JOIN web_games ON web_games.game_id=web_game_scores.score_game_id  
GROUP BY web_games.game_id, game_name_tr, game_name_en, game_url_tr, game_url_en, game_small_image, category_name_tr, category_name_en, category_url_tr, category_url_en, user_name, user_url, score_point 
ORDER BY web_game_scores.score_date DESC 
LIMIT 5

注意:该方案会保留所有不同字段组合的行,如果你的需求是每个游戏只保留一条记录,这个方案可能不符合预期。

方案2:子查询获取最新记录(推荐,贴合业务需求)

如果你的意图是获取每个游戏的最新一条评分记录,再取前5条,可以通过子查询先锁定每个游戏的最新评分,再关联表获取完整数据:

SELECT wgs.game_id, g.game_name_tr, g.game_name_en, g.game_url_tr, g.game_url_en, g.game_small_image, 
       c.category_name_tr, c.category_name_en, c.category_url_tr, c.category_url_en, 
       u.user_name, u.user_url, wgs.score_point
FROM (
    -- 先获取每个游戏的最新评分记录
    SELECT score_game_id, score_user_id, score_game_category_id, score_point, score_date
    FROM web_game_scores
    WHERE (score_game_id, score_date) IN (
        SELECT score_game_id, MAX(score_date)
        FROM web_game_scores
        GROUP BY score_game_id
    )
) wgs
INNER JOIN web_users u ON wgs.score_user_id = u.user_id
INNER JOIN web_game_categories c ON wgs.score_game_category_id = c.category_id
INNER JOIN web_games g ON g.game_id = wgs.score_game_id
ORDER BY wgs.score_date DESC
LIMIT 5

方案3:临时关闭only_full_group_by(仅调试用)

如果只是临时调试,可以在当前会话中关闭该模式,但生产环境不推荐:

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

长期关闭会破坏SQL标准一致性,可能导致数据结果不可预期。

内容的提问来源于stack exchange,提问作者Php Master

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:27:13