的MySQL
我有表,我存储了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。
编辑:我刚刚理解的一个解决方案, - 将所有匹配项都作为字符串(如001010101111010101011),然后将其拆分为字符串数组,分隔符为“0” - > [1,1,1,111,...]并且只取最长的字符串长度。
但是在这种情况下我必须编写服务器端代码= \那不好,但是mb最快。
答案 0 :(得分: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)
上有索引,则此查询应该运行得更快。