Mysql 求和直到某个值
我尝试了一些其他的话题,但没有找到真正适合我的答案。 我在mysql中有一个带有一些值的活动表Mysql 求和直到某个值,mysql,group-by,sum,Mysql,Group By,Sum,我尝试了一些其他的话题,但没有找到真正适合我的答案。 我在mysql中有一个带有一些值的活动表 | id| user_id | elevation | distance | |---|------------|--------------------|----------| | 1 | 1 | 220 | 5000 | | 2 | 1 | 300 | 7000
| id| user_id | elevation | distance |
|---|------------|--------------------|----------|
| 1 | 1 | 220 | 5000 |
| 2 | 1 | 300 | 7000 |
| 3 | 2 | 520 | 2000 |
| 4 | 2 | 120 | 3500 |
我需要计算距离和高程的总和,直到距离总和达到某个值为止
例如,达到5000之前的总和:
用户1-距离5000-标高220
用户2-距离5500-标高640
我找到了很多解决方案,但没有一个是与group_by合作的。我如何在mysql中做到这一点
更新:我使用了那个查询,但现在我遇到了另一个问题。连接总是使用插入顺序,而不是我想要的日期时间字段
SELECT
t.*
FROM
(
SELECT
t.*,
(
@d := @d + DISTANCE
) AS running_distance
FROM
(
SELECT
t.*,
c.meta
FROM
inscricao i
INNER JOIN categorias c ON
i.categoria_id = c.id
LEFT JOIN(
select
t.data_inicio,t.usuario_id,t.aplicativo,t.data_fim,t.distance,t.tempo_decorrido,t.ritmo_cardiaco,t.velocidade_media,t.type,t.ganho_de_altimetria
from
corridas t
order by
data_inicio asc
) t ON
t.usuario_id = i.usuario_id
AND t.data_inicio >= i.inicio
AND t.data_fim <= i.fim
WHERE
i.desafio_id = 29
AND(
i.usuario_id = 5354
)
ORDER BY
data_inicio asc
-- usuario_id
) t
join (
SELECT
@u :=- 1,
@d := 0
) params
ORDER BY
data_inicio asc
) t
WHERE
(
running_distance >= meta * 1000
AND running_distance - DISTANCE < meta * 1000
)
OR(
running_distance <= meta * 1000
)
order by
data_inicio desc
因此,如果在之后插入旧的活动,则总和将出错。有人知道如何处理它吗?您可以使用变量来获得累积和。然后是一些简单的过滤逻辑:
select t.*
from (select t.*,
(@d := if(@u = user_id, @d + distance,
if(@u := user_id, distance, distance)
)
) as running_distance -- pun intended ??
from (select t.*
from t
order by user_id, id
) t cross join
(select @u := -1, @d := 0) params
) t
where running_distance >= 5000 and
running_distance - distance < 5000;
注:
较新版本的MySQL对变量赋值和排序很挑剔。早期版本的MySQL不需要最里面的子查询。
MySQL不保证select中表达式的求值顺序。因此,所有变量赋值都在一个表达式中。
如果距离可以为负,则用户可能在结果集中有多行。
这不是聚合查询。
为什么必须使用group_by?@mypetlion否则您如何获得每个用户ID的总数?您说您找到了许多解决方案,但group_by没有。我想我不知道你的意思。你的意思是,你已经找到了解决方案,可以满足你对表格的总体需求,但不能满足每个用户的需求?我必须按总距离对用户进行排名,如果是平局,则按海拔进行排名