2017-10-26 14 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でこれを行うのですか?


更新:私はそのクエリを使用しましたが、別の問題があります。結合は常に挿入順序を使用し、私が必要とするdatetimeフィールドは使用しません。

したがって、古いアクティビティが挿入されると、合計が不正になります。誰かがそれを処理する方法を知っていますか?

+0

なぜgroup_byを使用する必要がありますか? – mypetlion

+0

@mypetlionどのようにユーザーIDごとに1つの合計を得るでしょうか? – 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の式の評価順序を保証しません。したがって、すべての変数の割り当ては単一の式になります。
  • 距離が負の場合、結果セットに複数の行が表示されることがあります。
  • これは集約クエリではありません。
関連する問題