如何计算每位球员的最长连胜纪录

Posted

技术标签:

【中文标题】如何计算每位球员的最长连胜纪录【英文标题】:How to count longest streak per player 【发布时间】:2011-07-26 09:59:46 【问题描述】:

我有一个名为 TournamentXPlayer 的 mysql 扑克数据库,其中包含一个名为 TournamentXPlayerID 和 TournamentID、PlayerID、Finish 和 Payout 的主索引。 我一直在寻找方法来计算每个玩家获得现金奖励的最长连胜纪录。稍后我想包括其他一些东西,比如球员的个人连续纪录(不是所有球员都参加每场比赛,但有些球员在比赛时表现非常好)、最长的连续获胜次数,甚至最长的连续没有获奖。但是,目前我根本无法计算出如何最好地计算连胜。 这个可以吗?

谢谢 特里

【问题讨论】:

【参考方案1】:

我假设锦标赛 ID 会自动递增,因此它提供了数据的年表。

这是组内排序的经典问题。为此,您需要考虑以下变量:

mysql> set @p_id:=-1; set @streak:=0;
mysql> select playerID,max(streak) from (select playerID,@streak:=if(Payout=0,0,if(@p_id=playerID,@streak+1,1)) streak, @p_id:=playerID from (select playerID,TournamentID,Payout from table order by 1,2) a) a group by 1;

在本例中,etap 是:

按玩家排序,然后按锦标赛排序 对于每个玩家: 如果有支付,则增加连续变量 如果不是则设置为 0 如果玩家更换,将连胜设置为 0。 p_id!=玩家ID。 p_id 封装了最后考虑的玩家的信息。

【讨论】:

谢谢。我稍后会给出这个。我会告诉你我的进展情况。 这很棒,并且在作为独立查询运行时可以完成工作。我的问题是,由于嵌入式查询,mySQL 不允许我将其保存为视图,并且由于用户定义的变量,我似乎无法分离嵌入式查询。我尝试将它转换为 php 并在网页上运行它,但它显示 max(streak) 为 1。我相信这是因为我没有先定义变量。你知道吗? A.如何将其重写为可以保存为视图的单独查询。或者 B. 如何将其全部转换为 PHP 代码? 我想如果您为每个子查询创建一个视图,它可能会起作用。 如果您使用的是 PDO,则对查询有一些预处理,因此作为独立查询与 php 中的查询,结果可能会有所不同。如果您不想要预处理,您可以执行 setAttribute(PDO::ATTR_EMULATE_PREPARES, false);尽管这样做还有其他一些缺点【参考方案2】:

当您要计算连胜数时,您需要知道球员完成比赛的时间。否则,如果玩家在多桌游戏中,您将得到错误的结果,因为,他可能会在一场超级筹码锦标赛中玩 15 个小时并最终获得奖金,同时注册和退出多场超级筹码锦标赛。您可以按 ID-s(相对于开始时间)对锦标赛进行排序,但如果您没有时间,当玩家结束时,您将永远不会得到正确的结果。

如果我们假设玩家根本不会多桌,那么使用以下算法:

    阅读所有一位玩家的锦标赛。 按锦标赛 ID 对它们进行排序 搜索最长连胜 输出最长的连胜

发表评论,如果您有任何问题,我将编辑/完成我的答案

【讨论】:

谢谢。幸运的是,它是一个实时锦标赛数据库,因此无法进行多桌游戏,并且玩家按出场顺序完成比赛。

以上是关于如何计算每位球员的最长连胜纪录的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中的连胜纪录

在熊猫队中连续几周获得最长连胜纪录

使用标准 SQL 的最长连续

按团队分组的基于赢、平和输的连续连胜/非连胜

LQ0089 组队矩阵计算

假定要建立一个关于篮球职业联盟的数据库,需管理如下信息: 每个球队有球队名称所在城市; 每位球员有球员姓名薪酬; 每场比赛有比赛编号比赛时间比赛结果参加比赛的主场球队参加比赛的客场球