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

Ok。ご覧のとおり、ユーザーは負けることなく 3 試合に勝ちます (シリーズに勝つ)。それが私のクエリから必要なものです。

質問: このテーブルから最長の一連の勝利試合を取得するにはどうすればよいですか? クエリからだけで、SQL側またはサーバー側でループせずに可能ですか?

どうも。

編集:私が今理解している解決策の1つ-すべての一致を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 に答える