2013-03-29 41 views
0

MySQL的選擇最大勝利系列:SQL查詢

我有表,我在那裏存放user_matches,它的結果是:

n_match id_user id_score 
1  55  1 
1  66  0 

這意味着,「id爲55勝匹配ID = 1到用戶id = 66'的用戶。

所以,我們有10個,100個,1000個匹配,在用戶輸或贏對手:

n_match id_user id_score 
1  55  1 (win) 
1  66  0 
2  55  0 (lose) 
2  77  1 
3  55  1 (win) 
3  77  0 
4  55  1 (win) 
4  77  0 
5  55  1 (win) 
5  77  0 

確定。正如你所看到的,用戶贏3場比賽不失(贏系列賽) - 這就是我需要從我的查詢。

問題:我怎樣才能從這張桌子上獲得最長的系列賽冠軍?是否有可能沒有循環在SQL端或服務器端 - 只是從查詢?

Thx。

編輯:一個溶液I剛纔明白, - 讓所有的匹配,而像001010101111010101011串,然後將其分割成與分離器字符串數組 '0' - > [1,1,1,1111,。 ..],並採取最長的字符串長度。

但在這種情況下,我必須寫服務器端代碼= \這不好,但MB最快。

+0

它的*方式*不太複雜,只需按照正確的順序查詢並在PHP中循環處理。要做到這一點(沒有,如你所請求的,在一個mysql函數中循環)本質上是手動創建一個沒有SQL循環的循環,它變得龐大笨重,不可能*維護,你不應該這樣做。 – Jason

回答

0

要做到這一點的最好方法是計算任何比賽的累計損失數。對於一系列的勝利,這個值是不變的。然後您可以使用group by來獲取最長的這種序列的長度。

該版本的查詢與數據庫無關。它使用子查詢,以獲得數:

select user_id, max(NumWinsInRow) 
from (select user_id, cumlosses, count(*)-1 as NumWinsInRow 
     from (select m.*, 
        (select sum(case when id_score = 0 then 1 else 0 end) from user_matches m2 where m2.id_user = m.id_user and m2.n_match <= m.n_match 
        ) as CumLosses 
      from user_matches m 
      ) t 
     group by cumlosses, user_id 
    ) t 
group by user_id 

這個查詢應該運行得更快,如果你對user_matches(id_user, n_math, id_score)有一個索引。