2013-09-28 58 views
2

我有一張表可以接收遊戲結果。每場比賽都有自己的ID,只能持續7天。每天一次,所有的遊戲都將他們的結果放到這張表格中(技能A,技能B ......的結果都存儲在一列中)。我需要能夠在MySQL中檢索:我需要顯示每個遊戲(game_id)及其所有結果,以及每個日期結果(可能已經升高或降低)之間的進度。如何計算mysql行之間的差異,種類不同

像這樣的東西應該是結果:

Game_id date  result_a progress result_b progress  
1234  2013-09-01 10   0   8   0 
1234  2013-09-02 08   -2   6   -2 
1234  2013-09-03 15   7   10   4 
1234  2013-09-04 19   4   13   3 
4321  2013-09-01 09   0   7   0 
4321  2013-09-02 18   9   9   2 
4321  2013-09-03 15   -3   11   2 
4321  2013-09-04 09   -6   16   4 

任何提示如何處理這個容易(與約4000行可能成爲什麼)?

http://sqlfiddle.com/#!2/70a96/4

+0

待辦事項你只需要SQL語句,或者你也可以在服務器端代碼上工作? –

+0

我想知道在MySQL中可以做多遠,以及我可能會在PHP中使用什麼 –

回答

1

如果你能犯這種價值的DB之前在PHP中工作,你可以有一整週的所有值以及基於差異可以通過每個數據循環,然後更新進度在當前和之前之間,然後用新的進度值更新表格。

請原諒我寫作只是一個僞代碼,正如我在PHP

//Get the values from the Database, only the columns, game_id, date, result_a, result_b 
for(i=0;all values) 
{ 
    progress[i] = result[i]- result[i-1]; 
} 

//finally save the result as you have prgress value for all i's 
+0

是的,我一直在尋找進行預處理。數據來自外部htmlfile b經過處理並導入到dbase中。這將是一個每日cronjob,所以它可能會這樣做,但目前,我們想嘗試它的輸出... –

1

中號也不好以下查詢應該產生你想要的輸出(除列的順序)。這裏的訣竅是檢查前一個遊戲ID是否仍然是相同的(變量),如果是,則用前面的結果數據(變量)進行相減以得到結果,否則返回0.

爲什麼列訂單有點不同?這是因爲否則變量已被當前值覆蓋,所以您將始終得到0。這就是爲什麼你必須在比較和減法之後設置「以前的」變量。

SELECT 
    @progress_a := IF(@prevGameId = data.game_id, 
         data.result_a - @prevResultA, 
         0) AS 'progress_a', 
    @prevResultA := data.result_a AS 'result_a', 
    @progress_b := IF(@prevGameId = data.game_id, 
         data.result_b - @prevResultB, 
         0) AS 'progress_b', 
    @prevResultB := data.result_b AS 'result_b', 
    data.registration_date, 
    (@prevGameId := data.game_id) AS 'game_id' 
FROM (SELECT 
      game_id, 
      result_a, 
      result_b, 
      registration_date 
     FROM games 
     ORDER BY game_id, registration_date 
    ) AS data 
JOIN (SELECT 
      @prevGameId := NULL, 
      @prevResultA := NULL, 
      @prevResultB := NULL 
    ) dummy 

最後一個JOIN是初始化變量(如果只能激發1個查詢)所必需的。否則,您可以使用SET語句來初始化變量(在SELECT之前)。

FROM中的SELECT是必需的,因爲不保證每個遊戲的記錄被分組。所以我確定他們一起訂購併在註冊日期進行排序。好處是,如果你不能保證每個註冊日期(每場比賽)都是唯一的,你甚至可以將每場比賽/ registration_date分組。注意:如果您遇到嚴重的性能問題(不應該是,我認爲),您必須確實在應用程序中處理它,或者在插入數據時計算進度(存儲「進度」數據冗餘)。

+0

這真是太神奇了。在凌晨2點進行調查有點複雜,但它肯定會填滿我的星期天早上!我會回過頭來看看它的進展,因爲db的性能有點複雜...... –

+0

它看起來比實際情況要複雜得多;-)。讓我知道你是否能夠使用上述查詢在你的項目中完成它。 – Styxxy

1

試試這個 - 它在你的sqlfiddle

SELECT g.id, g.game_id, g.registration_date as today, y.registration_date as yesterday 
    ,g.result_a as result_a 
    ,COALESCE(g.result_a - y.result_a,0) as progress_a 
    ,g.result_b as result_b 
    ,COALESCE(g.result_b - y.result_b,0) as progress_b 
FROM games g 
LEFT JOIN games y 
    ON g.game_id = y.game_id 
    AND g.registration_date > y.registration_date 
WHERE NOT EXISTS 
    (SELECT * 
    FROM games 
    WHERE games.registration_date > y.registration_date 
    AND games.registration_date < g.registration_date) 
ORDER BY g.game_id, g.registration_date, y.registration_date 

工作如果約會總是順序(即此前的比賽中總是在昨天,那麼SQL查詢變得簡單多了:

SELECT g.id, g.game_id, g.registration_date as today, y.registration_date as yesterday 
    ,g.result_a as result_a 
    ,COALESCE(g.result_a - y.result_a,0) as progress_a 
    ,g.result_b as result_b 
    ,COALESCE(g.result_b - y.result_b,0) as progress_b 
FROM games g 
LEFT JOIN games y 
    ON g.game_id = y.game_id 
    AND DATEDIFF(g.registration_date, y.registration_date) = 1 
ORDER BY g.game_id, g.registration_date, y.registration_date 
相關問題