选择max win series:sql query

时间:2013-03-29 11:56:27

标签: php mysql sql

的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最快。

1 个答案:

答案 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)上有索引,则此查询应该运行得更快。