14
08月
2024
MySQL中的错误代码1055通常与ONLY_FULL_GROUP_BY SQL模式有关。当SQL模式设置为ONLY_FULL_GROUP_BY时,如果你在一个GROUP BY查询中选择了没有出现在GROUP BY子句中的列,MySQL就会抛出1055错误。
解决方案
1:修改SQL查询:
如果你需要在结果集中显示未出现在GROUP BY子句中的列,可以使用ANY_VALUE()或聚合函数如MIN(), MAX(), COUNT(), SUM()等来确保所有选择的列都参与了分组。
SELECT phone_number, ANY_VALUE(name) AS name
FROM table1
GROUP BY phone_number;
2:使用窗口函数:
如果你想获取每个分组的第一条记录,可以使用窗口函数ROW_NUMBER()。
SELECT phone_number, name
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY phone_number ORDER BY name) AS temp1
FROM table1
) AS t
WHERE temp1 = 1;
3:修改sql_mode:
如果你确定你的查询逻辑不会导致数据歧义,可以通过修改MySQL服务器的sql_mode来禁用ONLY_FULL_GROUP_BY。
-- 查看当前的sql_mode
SELECT @@sql_mode;
-- 修改my.cnf中的[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服务
service mysqld restart
注意事项
修改sql_mode可能会影响其他依赖于ONLY_FULL_GROUP_BY的行为的应用程序,因此请谨慎操作。
使用ANY_VALUE()或其他聚合函数可能会返回任意一个值,这可能导致结果集中的某些列值不确定。