Странное поведение с sum() MySQL

#mysql #sql #sum #aggregate-functions

#mysql #sql #сумма #агрегатные функции

Вопрос:

Я пытаюсь составить эту сумму, но результат странный!

Структура таблицы: 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
Я не понимаю, почему ??? 🙁

Комментарии:

1. Первое, что вы должны узнать, это как использовать SUM() . Конечно, это даст вам тот же ответ. Он суммирует все строки в таблице. Независимо от того, какое ограничение вы установили, оно вернет только 1 строку.

2. «Странное поведение с SUM ()» В поведении нет ничего странного. Это работает так, как и ожидалось.

3. Каков ваш ожидаемый результат?

Ответ №1:

Во-первых, вам нужно 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 принудительное преобразование в число.