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

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

谢谢 特里

【问题讨论】:

    标签: mysql database poker


    【解决方案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(相对于开始时间)对锦标赛进行排序,但如果您没有时间,当玩家结束时,您将永远不会得到正确的结果。

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

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

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

    【讨论】:

    • 谢谢。幸运的是,它是一个实时锦标赛数据库,因此无法进行多桌游戏,并且玩家按出场顺序完成比赛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多