计算MySQL中的概率

时间:2012-11-05 03:11:44

标签: php mysql

我知道我的订单需要很多计算,但我希望你会把它视为一种挑战。

我的名为matchup的表格如下:

注意:每列的数据表(players除外)为decimal(5,2)

+------------------------------------------------------------------+
|players    player1 player2 player3 player4 player5 player6 player7|
+------------------------------------------------------------------+
|player1    NULL    47.01   52.22   47.59   47.79   43.67   47.61  |
|player2    51.34   NULL    51.76   49.29   48.22   44.46   48.16  |
|player3    46.00   46.33   NULL    41.90   40.46   41.17   39.66  |
|player4    50.34   48.39   55.65   NULL    50.47   44.89   48.48  |
|player5    50.23   49.25   56.76   46.76   NULL    47.27   47.61  |
|player6    54.96   53.77   56.92   53.33   51.36   NULL    49.07  |
|player7    51.03   50.00   58.12   49.12   50.20   48.55   NULL   |
+------------------------------------------------------------------+

此表显示每位玩家对其他玩家的概率(以%表示)。该表应如下所示:例如,player1有47.01%的机会赢得对玩家2的胜利。玩家反对自己的概率在这里没有意义,在计算赔率时应该省略数据。

想象一下,你是一个团队的经理,你知道你的对手团队将是由1-5名球员组成。玩家姓名将在以下变量$a$b$c$d$e中给出。例如,它可以是$a='player2'; $b='player4'; $c='player7'(在这种情况下,我们的对手团队中只有3名玩家)。

根据这些信息,我们的目标是确定哪些是面对敌方队伍的最佳球员,以及让他们有机会再次赢得另一支球队。

在这个例子中,每个球员赢得对手球队的概率由下式给出:

player1 = mean(47.01; 47.59; 47.61) = 47.40
player2 = cannot be chosen (because it is already chosen by the other team)
player3 = mean(46.33; 41.90; 39.66) = 42.63
player4 = cannot be chosen
player5 = mean(49.25; 46.74; 47.71) = 47.87
player6 = mean(53.77; 53.33; 49.07) = 52.06
player7 = cannot be chosen

此结果应作为关联数组预先设置,其值按降序排列:

$result = array(
'player6' => '52.06',
'player5' => '47.87',
'player1' => '47.40',
'player3' => '42.63'
);

请注意,此表只是一个摘录,代码应考虑到该表可能涉及7个以上的玩家。

任何帮助都会得到满足!

1 个答案:

答案 0 :(得分:0)

我将您的表格结构更改为

桌面播放器:
PlayerID
选手姓名
...

表格小组:
TeamID
队名
...

表TeamMembership
TeamID
PlayerID

表格概率
Player1ID
Player2ID
Probability1Beats2

然后,假设团队ID 1包含玩家ID 2,4和7,就像你的例子一样,你可以这样做:

SELECT Pl.PlayerName, SUM(Pr.Probability1Beats2)/COUNT(DISTINCT(Pr.Player2ID)) AS Avg
FROM (Team T LEFT JOIN TeamMembership M ON T.TeamID = M.TeamID), Probability Pr, Player Pl
WHERE Pr.Player2ID = M.PlayerID
AND M.TeamID = 1
AND Pr.Player1ID NOT IN (
    SELECT PlayerID FROM TeamMembership M2
    WHERE M2.TeamID = 1
) 
AND Pr.Player1ID = Pl.PlayerID
GROUP BY Pr.Player1ID
ORDER BY Avg DESC

查询可能并不完美,但它可以为您提供帮助。