2016-10-04 58 views
0

自從兩天以來,我一直困擾着一個問題,我需要幫助。按順序檢索值,並使用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 

在這個表,我想知道誰得到一個以上的活動是什麼兩項活動之間的時間的人。

因此,在這個例子中,如果我們可以減少天數,我們會看到約翰和鮑勃有兩個活動,約翰用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是減法後做是完全錯誤的。我沒有看到好的結果,因爲我想對排序的天數進行連續的減法運算。

看來我不能對IN結果進行排序,所以你知道是否有辦法解決我的問題嗎?

非常感謝您的幫助!

順便說一句:我不知道如何正確格式表,所以任何幫助,將不勝感激,非常感謝!

回答

0

你可以這樣做:

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; 

注意,這個經歷了很大的努力把所有的操作上的變量,在一個表達式(因此在case條件怪異= NULL)。原因是MysQL不保證select子句中表達式的評估順序,因此可能會按錯誤的順序評估多個分配。

+0

非常感謝您的幫助和評論,這真的很有幫助。 Unfornately我只得到空值,因爲我的桌上的@n <>名稱條件,我不知道爲什麼。 我試圖在選擇查詢中將值名分配給@n,但它不會改變任何內容。 我將盡力解決這個問題。 非常感謝您的回答我通過查看您的代碼瞭解了很多。 – Mike

+0

@Mike。 。 。我留下了一些東西。 –