首页 > 解决方案 > 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,回报是相同的,我不明白为什么???:(

标签: mysqlsqlsumaggregate-functions

解决方案


首先,您需要一个group by子句来使您的代码成为有效的聚合查询。然后,您不应该将数字存储为字符串。最后,order bylimit您的上下文中几乎没有意义。它在聚合后应用,而您的代码最多返回一行。

SELECT id_user, SUM(solde + 0) as sum_solde
FROM `solde_user` 
WHERE id_user = 102 
GROUP BY id_user

solde + 0强制转换为数字。


推荐阅读