ONLY_FULL_GROUP_BY 是 MySQL 5.7 及更高版本中默认启用的 SQL 模式之一,它对 GROUP BY 查询施加了更严格的语义检查。在此模式下: - SELECT 列表中的非聚合列必须出现在 GROUP BY 子句中 - HAVING 条件只能引用 GROUP BY 中的列或聚合函数
遗留系统兼容性:
特定查询需求:
SELECT user_id, username FROM users GROUP BY user_id
(username 不在 GROUP BY 中)简化复杂查询:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
修改 MySQL 配置文件(my.cnf 或 my.ini):
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
然后重启 MySQL 服务。
sql
SELECT user_id, ANY_VALUE(username) FROM users GROUP BY user_id
禁用 ONLY_FULL_GROUP_BY 应视为临时解决方案,长期来看修正查询是更可靠的做法。