我试过一些其他的话题,但却找不到对我有用的答案。我有一个带有一些值的活动表(在mysql中)
| id| user_id | elevation | distance |
|---|------------|--------------------|----------|
| 1 | 1 | 220 | 5000 |
| 2 | 1 | 300 | 7000 |
| 3 | 2 | 520 | 2000 |
| 4 | 2 | 120 | 3500 |我需要把距离和海拔相加,直到距离之和到一定值为止,每个user_id。
例如,达到5000为止的总和:
我找到了许多解决方案,但没有一个使用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因此,如果在后面插入一个较旧的活动,和就会出错。有人知道怎么处理吗?
发布于 2017-10-26 18:13:43
您可以使用变量来获得累积和。。。然后是一些简单的过滤逻辑:
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;备注:
order by都很挑剔。在早期版本的MySQL中不需要最内部的子查询。select中表达式的计算顺序。因此,所有变量赋值都在一个表达式中。https://stackoverflow.com/questions/46961058
复制相似问题