pymysql.err.OperationalError: (1055, “Expression #3 of SELECT list is not in GROUP BY clause and con

报错如下

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;

如果 column2column3 不是聚合函数的一部分,并且没有被包含在 GROUP BY 子句中,当 sql_mode 包括 ONLY_FULL_GROUP_BY 时,这个查询会引发错误。

如何解决

有几种方法可以解决这个问题:

  1. 修改查询:修改你的 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.cnfmy.ini)中,你可以设置 sql_mode 并移除 ONLY_FULL_GROUP_BY,然后重启 MySQL 服务。在配置文件中添加或修改以下行:

     

    makefile

  1.  

    sql_mode = "其他模式,但不包括ONLY_FULL_GROUP_BY"

选择哪种方法取决于你的具体情况。最好的做法通常是修改查询,以确保它符合 ONLY_FULL_GROUP_BY 的要求,这有助于确保查询的结果是明确和可靠的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值