0

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 端或服务器端不循环 - 仅来自查询?

谢谢。

编辑:我刚刚理解的解决方案之一, - 将所有匹配项作为字符串获取,例如 001010101111010101011,然后将其拆分为带有分隔符 '0' -> [1, 1, 1, 1111, ...] 的字符串数组,然后取最长的字符串长度。

但在这种情况下,我必须编写服务器端代码 =\ 这不好,但 mb 最快。

4

1 回答 1

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)

于 2013-03-29T12:22:58.743 回答