如何解决Python MYSQL GROUP BY 问题
- #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))
我的数据库表看起来像:
问题
解决方法
这取决于您要实现的目标,例如,如果您有一个数据库: 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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。