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 |