2017-10-26 5 views
0

다른 주제를 시도했지만 실제로 저에게 도움이되는 답을 얻을 수 없습니다. 은 내가 USER_ID 당, 특정 값까지 거리의 합까지 거리와 고도를 요약 할 필요가특정 값까지 합계

| id| user_id |  elevation  | distance | 
|---|------------|--------------------|----------| 
| 1 | 1   | 220    | 5000  | 
| 2 | 1   | 300    | 7000  | 
| 3 | 2   | 520    | 2000  | 
| 4 | 2   | 120    | 3500  | 

(MySQL의에서) 어떤 값으로 활동 테이블이 있습니다.

예, 5000까지 합에 도달 :

  • 사용자 1 - 거리 5000 - 고도 220
  • 사용자 2 - 나는 많은 솔루션을 발견 (640)

상승하지만 아무도과 - 거리 5500 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 

따라서 이전 활동이 삽입되면 합계가 잘못됩니다. 누군가 그것을 처리하는 방법을 알고 있습니까?

+0

왜 group_by를 사용해야합니까? – mypetlion

+0

@mypetlion 사용자 ID 당 하나의 합계를 얻으려면 어떻게해야합니까? – Barmar

+0

당신은 group_by와 함께 많은 솔루션을 찾았지만 아무 것도 찾지 못했다고하셨습니다. 나는 네가 의미하는 것을 몰랐다. 일반적으로 테이블에 대해 원하는 것을 수행 할 솔루션을 찾았지만 각 user_id에 대한 솔루션을 찾지 못했습니까? – mypetlion

답변

1

변수를 사용하여 누적 합계를 얻을 수 있습니다. . . 다음 몇 가지 간단한 필터링 로직 :

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에 표현식 평가 순서를 보증하지 않습니다. 따라서 모든 변수 할당은 단일 표현식에 있습니다.
  • distance가 음수 일 수있는 경우 결과 집합에 둘 이상의 행이있을 수 있습니다.
  • 이것은 집계 쿼리가 아닙니다.