0

我知道我的订单需要很多计算,但我希望您能将其视为一项挑战。

我有一个名为的表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% 的机会战胜 player2。球员对自己的概率在这里没有意义,在计算赔率时应该省略这些数据。

想象一下,你是一个球队的经理,你知道你的对手球队将由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 名玩家。

任何帮助将不胜感激!

4

1 回答 1

0

我会改变你的表结构

表播放器:
PlayerID
PlayerName
...

表团队:
TeamID
TeamName
...

表 TeamMembership
TeamID
PlayerID

表概率
Player1ID
Player2ID
Probability1Beats2

然后,假设 Team 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

该查询可能并不完美,但它应该给你一个线索。

于 2012-11-05T03:46:56.120 回答