2016-10-04 5 views
0

2日後から問題を解決するのに苦労しています。値を順番に取得し、mySQLを使用して行を引く

私は、SQLテーブルの連続した行に対して減算を行いますが、前に値を並べ替えることで行いたいと思います。私はこれらのように私のテーブルを持っている。例えば

Name  | Activity | Day 
John | Tennis | Day10 
Bob | Swimming | Day9 
Mathilda | Tennis | Day2 
John | Swimming | Day2 
Bob | Tennis | Day2 
John | Computer Science | Day 10 

この表では、私は、複数のアクティビティ2つのアクティビティ間の時間は何を取得する人のために知っていただきたいと思います。

この例では、日を差し引くことができれば、JohnとBobが2つのアクティビティを持ち、Johnの8日間の最大休憩に達しています。

私はそうのようにそれを行うことを試みた:

SET @previousDay:=0; 

SELECT Name, days, @previousDay - day, @previousDay:=day 
FROM table 
WHERE Name IN (SELECT Name FROM table group by Name having count(Name) > 1) 
ORDER BY Name, Day 

しかし、ORDER BYがsubstraction後に行われるように、それは完全に偽です。ソートされた日の連続した値を持つ減算を作成したいので、良い結果は表示されません。

INの結果を並べ替えることができないようですので、私の問題を解決する方法があるかどうか知っていますか?

ありがとうございました!

ご参考までに:どのようにテーブルを正しくフォーマットするかわからないので、何か助けていただければ幸いです!

答えて

0

あなたはこれを行うことができます。これは、単一の式(case条件におけるので、奇妙な= NULL)中の変数のすべての操作を置くために多大な努力を通過すること

select t.*, (previousDay - day) as diff 
from (select t.*, 
      (@pd := (case when @n <> name 
          then if(@n := name, NULL, NULL) -- does happen 
          when (@tmp_pd := @pd) = null then null  -- never happens 
          when (@pd := day) = null then null -- never happens 
          else @tmp_pd 
         end) 
      ) as previousDay 
     from t cross join 
      (select @n := '', @pd = -1) params 
     order by name, day 
    ) t 
where previousDay is not null; 

注意を。その理由は、MysQLはselect節の式の評価順序を保証しないため、複数の割り当てが間違った順序で評価される可能性があるからです。

+0

本当に有益な助けとご意見をいただき、ありがとうございます。 テーブルの@n <>の名前の条件のために、私は空白の値しか得られません。理由はわかりません。 selectクエリで値の名前を@nに代入しようとしましたが、何も変更されません。 私はこれを解決しようとします。 お返事ありがとうございます私はあなたのコードを見て多くのことを学びました。 – Mike

+0

@Mike。 。 。私は何かを残しました。 –

関連する問題