sat*_*oru 2 python mysql temp-tables mysql-python
这是我用来重现问题的表定义:
create table test_sum_type
(
kind char(1) not null,
n tinyint not null
);
Run Code Online (Sandbox Code Playgroud)
测试数据:
+------+---+
| kind | n |
+------+---+
| A | 1 |
| B | 1 |
| A | 2 |
+------+---+
Run Code Online (Sandbox Code Playgroud)
查询使用MySQLdb:
In [32]: cur.execute("select kind, sum(n) from test_sum_type group by kind")
Out[32]: 2L
In [33]: cur.fetchall()
Out[33]: (('A', Decimal('3')), ('B', Decimal('1')))
In [34]: cur.execute("select kind, n from test_sum_type")
Out[34]: 3L
In [35]: cur.fetchall()
Out[35]: (('A', 1), ('B', 1), ('A', 2))
Run Code Online (Sandbox Code Playgroud)
如您所见,生成的列是Decimal我使用的时候sum.
我查看了MySQLdb的源代码,默认只设置了两种字段类型转换为Decimal:DECIMAL和NEWDECIMAL.
这可能是什么原因?有没有办法检查特定查询中使用的某些临时表的模式?
它是MySql中的设计.
GROUP BY(聚合)函数
SUM()和AVG()函数返回精确值参数(整数或DECIMAL)的DECIMAL值,以及近似值参数的DOUBLE值(FLOAT或DOUBLE).(在MySQL 5.0.3之前,SUM()和AVG()为所有数字参数返回DOUBLE.)
如果你需要返回一个INT然后CAST它.
SELECT kind, CAST(SUM(n) AS SIGNED) n
FROM table1
GROUP BY kind
Run Code Online (Sandbox Code Playgroud)
这是SQLFiddle演示