Mysql 每名球员每项赛事的连胜记录

Mysql 每名球员每项赛事的连胜记录,mysql,Mysql,我已经尝试了不同的解决方案与连胜搜索标准,但我看不出适合他们在我的情况 我有以下表格: 历史: +-------+-------+-----------+ | id | betid | betstatus | +-------+-------+-----------+ | 63281 | 63280 | lose | | 63280 | 63279 | won | | 63279 | 63278 | lose | | 63278 | 63277 | lose

我已经尝试了不同的解决方案与连胜搜索标准,但我看不出适合他们在我的情况

我有以下表格:

历史:

+-------+-------+-----------+
|   id  | betid | betstatus |
+-------+-------+-----------+
| 63281 | 63280 | lose      |
| 63280 | 63279 | won       |
| 63279 | 63278 | lose      |
| 63278 | 63277 | lose      |
| 63276 | 63275 | won       |
| 63275 | 63274 | won       |
| 63271 | 63270 | won       |
| 63270 | 63269 | won       |
| 63269 | 63268 | won       |
| 63268 | 63267 | won       |
| 63267 | 63266 | lose      |
| 63266 | 63265 | won       |
| 63264 | 63263 | won       |
| 63262 | 63261 | won       |
| 63261 | 63260 | lose      |
| 63259 | 63258 | lose      |
| 63258 | 63257 | won       |
| 63257 | 63256 | lose      |
| 63256 | 63255 | lose      |
| 63254 | 63253 | won       |
+-------+-------+-----------+
赌注:

EventGames:-另一个存储游戏和事件之间关系的表,可以根据需要轻松集成

我需要帮助来构建MySQL语句,以确定至少连续5次获胜的玩家

非常感谢

编辑:下表可能更容易:

+-------+-----------+--------+----------+------+
| id    | betstatus | gameid | username | team |
+-------+-----------+--------+----------+------+
| 63281 | lose      |   7506 | player12 | C    |
| 63280 | won       |   7506 | player7  | A    |
| 63279 | lose      |   7506 | player3  | B    |
| 63278 | lose      |   7506 | player10 | B    |
| 63276 | won       |   7506 | player1  | A    |
| 63275 | won       |   7506 | player1  | A    |
| 63271 | won       |   7506 | player3  | A    |
| 63270 | won       |   7505 | player7  | B    |
| 63269 | won       |   7505 | player1  | B    |
| 63268 | won       |   7505 | player10 | B    |
| 63267 | lose      |   7505 | player3  | A    |
| 63266 | won       |   7505 | player12 | B    |
| 63264 | won       |   7505 | player10 | B    |
| 63262 | won       |   7504 | player10 | B    |
| 63261 | lose      |   7504 | player3  | A    |
| 63259 | lose      |   7504 | player3  | A    |
| 63258 | won       |   7504 | player10 | B    |
| 63257 | lose      |   7504 | player7  | A    |
| 63256 | lose      |   7503 | player7  | A    |
| 63254 | won       |   7503 | player12 | B    |
+-------+-----------+--------+----------+------+

您可以使用变量来获得所需的结果:

SELECT username, MAX(streak) AS streak
FROM (
  SELECT username, betstatus, id,
         @streak := IF(betstatus = 'lose', IF(@uid := username, 0, 0),
                      IF(@uid = username, @streak + 1,
                         IF(@uid := username, 1, 1))) AS streak

  FROM (
    SELECT b.username, bh.betstatus, bh.id
    FROM Bets AS b
    INNER JOIN BetHistory AS bh ON b.betid = bh.betid) AS t 
  CROSS JOIN (SELECT @streak := 0, @uid := '') AS vars
  ORDER BY username, id) AS s
WHERE streak >= 5  
GROUP BY username 
ORDER BY username 
注意:我使用了原始的表结构

注2:查询使用嵌套的IF表达式正确初始化和访问变量


此sql应用于联合表,该表在您的编辑中命名为BethHistory。使用的想法取自@Matt的评论

select Distinct(t.username)
from
    (select bh1.username, bh1.id, count(bh2.id) as streakGroup 
    from BetHistory bh1
    left join BetHistory bh2
    on bh1.id < bh2.id and bh1.username = bh2.username and bh1.betstatus <> bh2.betstatus
    where bh1.betstatus = 'won'
    group by bh1.id, bh1.username) as t
group by t.streakGroup, t.username
having Count(t.id) >= 5

。团队和gameid列被省略,因为它们没有被使用。

我尝试使用发布的答案,我感谢大家提出的好主意

虽然检查连胜很复杂,但我选择添加一个侦听器,每当游戏宣布赢家时,赢家的连胜都会增加,输家从0开始

然后,我可以简单地查询带有条纹条件的表


非常感谢,

这可能会更容易,但是,每一次下注都可能有不同的状态。Bets表也可以容纳团队,但上面的内容可能就足够了。@Matt,感谢链接,我去过那里,但由于数据结构的差异,我没有成功地采用它。BethHistory表中有id和betid列的目的是什么?你为什么需要betid?@IvanGritsenko,谢谢你的通知,这个结构制作粗糙,因此需要编辑。有什么需要帮忙的吗?看起来是这样的,我会试试,再推一推。非常感谢。
select Distinct(t.username)
from
    (select bh1.username, bh1.id, count(bh2.id) as streakGroup 
    from BetHistory bh1
    left join BetHistory bh2
    on bh1.id < bh2.id and bh1.username = bh2.username and bh1.betstatus <> bh2.betstatus
    where bh1.betstatus = 'won'
    group by bh1.id, bh1.username) as t
group by t.streakGroup, t.username
having Count(t.id) >= 5