0

我正在尝试创建一个高尔夫实时排行榜,该排行榜基于玩家拥有多少点等于理想点数。

理想的分数是每个洞 2 分。因此,如果一名球员打了 3 个洞,他应该得到 6 分。如果玩家有 6 分,则玩家积分为 0。如果玩家获得更多,他将获得 + 分和更少 - 分。

这里的问题是球员会在不同的洞上,有些人打了 2 个,有些人打了 3 个,也许有些人打了 7 个。所以不知何故,我需要计算总分,计算洞数并减去它们,我认为然后按减去。

这是我到目前为止得到的:

$result = mysqli_query($con,"SELECT SUM(ls.points) points
                                                 , COUNT(ls.fk_playerid) holes
                                                 , ls.fk_playerid
                                                 , u.fname
                                                 , u.lname 
                                    FROM ".$prefix."_livescore ls
                                         INNER JOIN ".$prefix."_users u
                                            ON ls.fk_playerid = u.userid
                                    WHERE fk_gameid=$gameid GROUP BY fk_playerid ORDER BY points DESC");
while($row = mysqli_fetch_array($result)){

    $idealpoints = $row['points'] - ($row['holes'] * 2);
    $players[] = array('uid' => $row['fk_playerid'], 'name' => $row['fname'].' '.$row['lname'], 'hole' => $row['holes'], 'points' => $idealpoints);

}

在这个例子中,我只是计算点数并按它排序。然后在循环中我找出理想点是什么。这使得排行榜不正确,因为打出最多洞的球员最有可能处于领先地位......

希望这是有道理的,并希望得到帮助...... :-)

4

2 回答 2

2
SELECT fk_playerid, fname, lname, points, holes, points-2*holes diff
FROM (
    SELECT  SUM(ls.points) points
            COUNT(ls.dk_playerid) holes,
            ls.fk_playerid, u.fname, u.lname
    FROM {$prefix}_livescore ls
    INNER JOIN {$prefix}_users u
    ON ls.fk_playerid = u.userid
    WHERE fk_gameid = $gameid
    GROUP BY fk_playerid) x
ORDER BY diff desc
于 2013-07-21T10:24:51.160 回答
0

我不太确定您是否要求一个公式来做出正确的排名,或者您是否只是想要一种将现有公式放在 sql 表达式中的方法。我会选择第一个假设。

这个公式几乎是正确的。您还需要除以$idealpoints打出的洞数,如下所示:

$idealpoints = ($row['points'] - ($row['holes'] * 2)) / $row['holes'];

因此,您将获得一个十进制值,您的排名可以基于该值。值越低 - 排名越好;像这个例子:

球员 1 在 2 个洞后有 5 分(比理想得分 +1)== (5 - 4) /2 = 0,5 理想分。
球员 2 在 3 个洞后得到 7 分(比理想得分 +1)== (7 - 6) /3 = 0,33 个理想分。

球员 2 的排名会更高,因为他在三个洞后只有 +1。球员 1 在两个洞之后已经 +1。

于 2013-07-21T10:53:42.480 回答