Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL-连胜_Php_Mysql_Sql_Gaps And Islands - Fatal编程技术网

PHP/MySQL-连胜

PHP/MySQL-连胜,php,mysql,sql,gaps-and-islands,Php,Mysql,Sql,Gaps And Islands,我试图展示一个用户的连胜记录,但我很难弄清楚我将如何写它——甚至是概念 下面是一个从最新数据库到最旧数据库的示例: id | win_id| loss_id| player id 1 | 123 | 999 | 123 2 | 123 | 999 | 123 3 | 999 | 123 | 123 4 | 123 | 999 | 123 因此,我想显示的是玩家的连胜\u id:123-因此,它应该为连胜回显'2',因为有一个中断,用户在id 3上

我试图展示一个用户的连胜记录,但我很难弄清楚我将如何写它——甚至是概念

下面是一个从最新数据库到最旧数据库的示例:

id | win_id| loss_id| player id
1  |  123  | 999    | 123
2  |  123  | 999    | 123
3  |  999  | 123    | 123
4  |  123  | 999    | 123

因此,我想显示的是玩家的连胜\u id:123-因此,它应该为连胜回显'2',因为有一个中断,用户在id 3上输了。

当前连胜的一个可能解决方案:找到所有玩家赢的比赛,但只有在以后没有失败的情况下:

SELECT COUNT(t.id)
  FROM table t
 WHERE t.player_id = 123
   AND t.win_id = 123 /* player 123 won */
   AND NOT EXISTS(SELECT * 
                    FROM table t2
                   WHERE t2.player_id = 123
                     AND t2.win_id <> 123 /* player 123 lost */
                 AND t2.id > t.id /* lost occur after the win we look at */
              )   

当前连胜的一个可能解决方案:查找所有玩家获胜的比赛,但只有在以后没有失败的情况下:

SELECT COUNT(t.id)
  FROM table t
 WHERE t.player_id = 123
   AND t.win_id = 123 /* player 123 won */
   AND NOT EXISTS(SELECT * 
                    FROM table t2
                   WHERE t2.player_id = 123
                     AND t2.win_id <> 123 /* player 123 lost */
                 AND t2.id > t.id /* lost occur after the win we look at */
              )   

我将您的问题理解为一个间隙和孤岛问题,您希望将相邻行组合在一起

下面是一种使用行号之间的差异来定义组的方法,这需要MySQL 8.0;然后,我们可以按胜利连胜进行聚合,按下降连胜长度进行排序,并仅保留顶部连胜:

select win_id, count(*) no_wins, min(id) start_id, max(id) end_id
from (
    select 
        t.*,
        row_number() over(partition by player_id order by id) rn1,
        row_number() over(partition by player_id, win_id order by id) rn2
    from mytable t
    where player_id = 123
) t
where win_id = 123
group by win_id, rn1 - rn2
order by no_wins desc
limit 1
:


我将您的问题理解为一个间隙和孤岛问题,您希望将相邻行组合在一起

下面是一种使用行号之间的差异来定义组的方法,这需要MySQL 8.0;然后,我们可以按胜利连胜进行聚合,按下降连胜长度进行排序,并仅保留顶部连胜:

select win_id, count(*) no_wins, min(id) start_id, max(id) end_id
from (
    select 
        t.*,
        row_number() over(partition by player_id order by id) rn1,
        row_number() over(partition by player_id, win_id order by id) rn2
    from mytable t
    where player_id = 123
) t
where win_id = 123
group by win_id, rn1 - rn2
order by no_wins desc
limit 1
:


这将显示用户123的最高收益 它适用于mysql 5.x

我添加了一些数据来显示它的功能


dbfiddle

这将显示用户123的最高收益 它适用于mysql 5.x

我添加了一些数据来显示它的功能


DBFIDLE

与win_id和loss_id相比,player_id列代表什么?对不起,这只是它将被分配给的用户,因此您可以获得该用户玩的所有游戏,例如,从xx选择*其中player_id=123按loss_id=999分组?player 123按该顺序有win、win、loss、win,其连胜为2?i、 e.无论何时,连续获胜的次数最多。如果玩家有win,win,loss,win,win,win,loss,win,win-win连胜是3?与win,win,loss,win-win-id和loss-win-id相比,player列的玩家id代表什么?抱歉,这只是它将被分配给的用户,所以你可以获得该用户玩的所有游戏,例如,从xx中选择*其中玩家id=123按损失分组\U id=999?玩家123有win,win,loss,win,按这个顺序,他的连胜是2?i、 e.无论何时,连续获胜的次数最多。如果玩家有赢,赢,输,赢,赢,赢,输,赢,输,赢,赢连胜是3? ✓ ✓
SELECT 
    id,
    IF(`loss_id` <> 123,
        @num:=@num + 1,
        @num:=0) winstreek
FROM
    (SELECT 
        *
    FROM
        wintable
    WHERE
        `player id` = 123
    ORDER BY `id`) t1,
    (SELECT @num:=0) a
id | winstreek -: | --------: 1 | 1 2 | 2 3 | 3 4 | 4 5 | 0 6 | 1 7 | 2 8 | 3 9 | 4 10 | 5 11 | 6 12 | 7 13 | 8 14 | 9 15 | 0
SELECT MAX(winstreek) winstreek
FROM 
(SELECT 
    id,
    IF(`loss_id` <> 123,
        @num:=@num + 1,
        @num:=0) winstreek
FROM
    (SELECT 
        *
    FROM
        wintable
    WHERE
        `player id` = 123
    ORDER BY `id`) t1,
    (SELECT @num:=0) a) b;
| winstreek | | --------: | | 9 |