报错如下
pymysql.err.OperationalError: (1055, "Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db.t_vulnerability.level' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")
问了AI,回答如下:
这个错误信息指出的问题与 MySQL 的 sql_mode
设置有关,特别是 ONLY_FULL_GROUP_BY
模式。当启用了 ONLY_FULL_GROUP_BY
模式时,所有在 SELECT
列表中,但不在 GROUP BY
子句中的列,都必须在一个聚合函数内。这个模式的目的是确保当使用 GROUP BY
时,返回的结果是确定的,因为如果 SELECT
列表中有不在 GROUP BY
中的列,那么这些列的值在分组中可能有多个,而 MySQL 不知道应该返回哪个值。
错误的原因
假设你有一个查询语句类似于:
SELECT column1, column2, column3 FROM table GROUP BY column1;
如果 column2
和 column3
不是聚合函数的一部分,并且没有被包含在 GROUP BY
子句中,当 sql_mode
包括 ONLY_FULL_GROUP_BY
时,这个查询会引发错误。
如何解决
有几种方法可以解决这个问题:
-
修改查询:修改你的 SQL 查询,确保所有在
SELECT
列表中的列要么是聚合函数的一部分,要么包含在GROUP BY
子句中。例如,如果你要保留column3
,你可以使用聚合函数(如MAX()
或MIN()
):
-
SELECT column1, MAX(column2), MAX(column3) FROM table GROUP BY column1;
-
禁用
ONLY_FULL_GROUP_BY
:虽然这不是推荐的做法,因为它可能隐藏潜在的错误,但你可以通过更改 MySQL 的sql_mode
来临时禁用ONLY_FULL_GROUP_BY
。这可以通过在 MySQL 客户端执行以下 SQL 命令来完成:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或者,针对当前会话:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
-
修改 MySQL 配置文件:在 MySQL 的配置文件(通常是
my.cnf
或my.ini
)中,你可以设置sql_mode
并移除ONLY_FULL_GROUP_BY
,然后重启 MySQL 服务。在配置文件中添加或修改以下行:makefile
-
sql_mode = "其他模式,但不包括ONLY_FULL_GROUP_BY"
选择哪种方法取决于你的具体情况。最好的做法通常是修改查询,以确保它符合 ONLY_FULL_GROUP_BY
的要求,这有助于确保查询的结果是明确和可靠的。