Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 求和直到某个值_Mysql_Group By_Sum - Fatal编程技术网

Mysql 求和直到某个值

Mysql 求和直到某个值,mysql,group-by,sum,Mysql,Group By,Sum,我尝试了一些其他的话题,但没有找到真正适合我的答案。 我在mysql中有一个带有一些值的活动表 | id| user_id | elevation | distance | |---|------------|--------------------|----------| | 1 | 1 | 220 | 5000 | | 2 | 1 | 300 | 7000

我尝试了一些其他的话题,但没有找到真正适合我的答案。 我在mysql中有一个带有一些值的活动表

| 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没有。我想我不知道你的意思。你的意思是,你已经找到了解决方案,可以满足你对表格的总体需求,但不能满足每个用户的需求?我必须按总距离对用户进行排名,如果是平局,则按海拔进行排名