微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python MYSQL GROUP BY 问题

如何解决Python MYSQL GROUP BY 问题

我有 2 个 MysqL 数据库

  • #1 是在 Raspbian RaspBerry pi 4 上创建的
  • #2 在虚拟 Ubuntu 服务器上创建。

我一直在与 RaspBerry pi 4 创建的 MysqL DB 交互没有任何问题,但现在我想将所有数据库迁移到虚拟 Ubuntu 服务器,以使我的系统更加灵活。

在我的 ubuntu 服务器上安装所有必需的模块后,我启动了我的 python 代码并注意到它不能正常工作。我收到一些关于 GROUP BY 语句的 MysqL 错误

MysqL.connector.errors.ProgrammingError: 1055 (42000): SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列“test.Operation_1109360548.ID”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

我试图执行的查询

sql = "SELECT Serial,ID,count(*) FROM {table} GROUP BY Serial"
cur.execute(sql.format(table=table_name))

我的数据库表看起来像:

database table

问题

  1. 有人可以建议为什么它允许我在 Raspbian 上运行的 MysqL DB 上执行此查询,但不允许我在 UBUNTU MysqL 上执行此查询吗?

  2. 如何解决这个问题?我没有看到这个查询有任何问题。我听说你可以修改 MysqL.cnf 但这不是最好的解决方

解决方法

这取决于您要实现的目标,例如,如果您有一个数据库: S-Serial,I-ID

S|I
1|2
1|3
2|4
3|5
3|4

您将序列号聚合为值 1,2,3,但如何处理 ID? S=1 应该有 ID=2 还是 ID=3? 您可以告诉您的查询如何处理 ID、聚合类型(例如 MAX、MIN、AVG)

您可以让数据库处理它,但要这样做,您需要禁用 ONLY_FULL_GROUP_BY 子句,这就是结果: The server is free to choose any value from each group,so unless they are the same,the values chosen are indeterminate. 要做到这一点,我会给你一个链接: Disable ONLY_FULL_GROUP_BY

示例:

SELECT Serial,MIN(ID),COUNT(*) FROM TABLE_NAME
GROUP BY Serial

另一方面,如果您的数据库如下所示:

S|I
1|2
2|3
3|1
4|4
5|5

因此 Serial 和 ID 的值是唯一的一对,您应该按这两列进行分组,因此您的查询可能如下所示:

SELECT Serial,ID,COUNT(*) FROM TABLE_NAME
GROUP BY Serial,ID
,

SERIAL 是 MySQL 中的一种数据类型。所以你必须把它放在反引号中 用作字段名:

sql = "SELECT `Serial`,count(*) 
        FROM {table} 
        GROUP BY `Serial`"
cur.execute(sql.format(table=table_name))

见:https://mariadb.com/docs/reference/mdb/data-types/SERIAL/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。