首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求和至一定值

求和至一定值
EN

Stack Overflow用户
提问于 2017-10-26 18:08:45
回答 1查看 161关注 0票数 1

我试过一些其他的话题,但却找不到对我有用的答案。我有一个带有一些值的活动表(在mysql中)

代码语言:javascript
复制
| id| user_id    |      elevation     | distance |
|---|------------|--------------------|----------|
| 1 | 1          | 220                | 5000     |
| 2 | 1          | 300                | 7000     |
| 3 | 2          | 520                | 2000     |
| 4 | 2          | 120                | 3500     |

我需要把距离和海拔相加,直到距离之和到一定值为止,每个user_id。

例如,达到5000为止的总和:

  • 用户1-距离5000 -高度220
  • 用户2-距离5500 -海拔640

我找到了许多解决方案,但没有一个使用group_by。我是如何在mysql中做到这一点的?

更新:我使用了这个查询,但现在我遇到了另一个问题。联接总是使用插入顺序,而不是我想要的日期时间字段。

代码语言:javascript
复制
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

因此,如果在后面插入一个较旧的活动,和就会出错。有人知道怎么处理吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 18:13:43

您可以使用变量来获得累积和。。。然后是一些简单的过滤逻辑:

代码语言:javascript
复制
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的最新版本对变量赋值和order by都很挑剔。在早期版本的MySQL中不需要最内部的子查询。
  • MySQL不保证select中表达式的计算顺序。因此,所有变量赋值都在一个表达式中。
  • 如果距离可以为负值,则用户在结果集中可能有多行。
  • 这不是聚合查询。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46961058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档