Coder之路 / 数据库 · 2023/09/22 0

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘database.table.column’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这个错误是 MySQL 数据库的 “ONLY_FULL_GROUP_BY” SQL 模式的一个结果。该模式要求在使用 GROUP BY 子句进行分组聚合时,SELECT 子句中的列必须是明确的聚合函数或在 GROUP BY 子句中列出的列。这是为了确保每个非聚合列的值在每个分组中是唯一的,以避免意外的数据不一致性。

在你的查询中,你可能有一个列或表达式,它不符合这个规则,也就是说,它不是在 GROUP BY 子句中列出的,也不是聚合函数。这将触发 “only_full_group_by” 模式并导致错误。

要解决这个问题,你有以下几种选择:

  1. 将所有非聚合列添加到 GROUP BY 子句:你可以将所有 SELECT 子句中的非聚合列都列在 GROUP BY 子句中,以确保查询是合法的。这通常是一个比较保守的做法,但在某些情况下可能需要。
  2. 使用聚合函数:如果你不需要明确列出非聚合列,而只是想执行聚合操作,那么你可以将所有 SELECT 子句中的列都用聚合函数包装起来。
  3. 修改 SQL 模式:如果你认为 “only_full_group_by” 模式对你的查询不适用,并且你有相应的权限,你可以尝试修改 MySQL 的 SQL 模式以允许这种行为。请注意,这可能会影响数据库的其他部分,因此需要小心谨慎操作。

    你可以在 MySQL 配置中或在会话级别使用以下命令来修改 SQL 模式:

    SET sql_mode = 'modes_to_enable';

    使用 select @@global.sql_mode 查询当前运行模式去掉其中的ONLY_FULL_GROUP_BY