mysql - sum() MySql 的奇怪行为
问题描述
我试着做这个总和,但结果很奇怪!
表结构:solde_user
id int(10)
date datetime
solde varchar(50) latin1_swedish_ci
id_user int(10°
内部数据
+--------+---------------------+----------+---------+
| id | date | solde | id_user |
+--------+---------------------+----------+---------+
| 127536 | 2020-12-15 03:26:02 | 465.0700 | 102 |
| 127311 | 2020-12-14 03:26:02 | 465.0700 | 102 |
+--------+---------------------+----------+---------+
我的请求
SELECT * FROM `solde_user` WHERE id_user = 102 ORDER BY date DESC LIMIT 1
返回
+--------+---------------------+----------+---------+
| id | date | solde | id_user |
+--------+---------------------+----------+---------+
| 127536 | 2020-12-15 03:26:02 | 465.0700 | 102 |
+--------+---------------------+----------+---------+
如果我写这个请求
SELECT id_user, SUM(solde) as sum FROM `solde_user` WHERE id_user = 102 ORDER BY date DESC LIMIT 1
回报是如此奇怪 - 为什么??!!!!
+---------+--------------------+
| id_user | sum |
+---------+--------------------+
| 102 | 405292.13999999996 |
+---------+--------------------+
如果我将限制设置为 2,回报是相同的,我不明白为什么???:(
解决方案
首先,您需要一个group by
子句来使您的代码成为有效的聚合查询。然后,您不应该将数字存储为字符串。最后,order by
在limit
您的上下文中几乎没有意义。它在聚合后应用,而您的代码最多返回一行。
SELECT id_user, SUM(solde + 0) as sum_solde
FROM `solde_user`
WHERE id_user = 102
GROUP BY id_user
solde + 0
强制转换为数字。
推荐阅读
- terraform - 如何在 Terraform 中获取调用模块的名称
- linux - Bash 脚本无法使用 systemd 启动
- xamarin.ios - 您可以覆盖导航控制器的“InteractivePopGestureRecognizer”操作吗?
- java - Redisson 库不支持 Redis ACL 安全性
- docker - 由于权限不足,无法插入 ClickHouse 数据库:/var/lib/clickhouse/data/
- matlab - Matlab中的嵌套循环
- java - xml xslt 转换:无法在另一个节点中获取一个节点
- html - 根据列数更改表格列宽
- python - pd.merge。错误:ValueError:错误的号码
- arrays - MongoDB聚合:检查数字数组是否包含负数的简单方法