我正在尝试创建一个高尔夫直播排行榜,该排行榜基于玩家与理想积分相等的积分数。
理想点是每个洞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);
}
在这个例子中,我只计算点数和顺序。然后在循环中我弄清楚理想点是什么。这使排行榜不正确,因为最有可能打出最多洞的球员将处于领先地位......
希望这是有道理的并且希望得到帮助......: - )
答案 0 :(得分: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
答案 1 :(得分: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。