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()或其他聚合函数可能会返回任意一个值,这可能导致结果集中的某些列值不确定。

延伸阅读
    发表评论