[英]Putting math into the sql query
我正在尝试创建一个高尔夫现场排行榜,该排行榜基于玩家与理想点数相等的点数。
理想点是每个洞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);
}
在这个例子中,我只计算它的点和顺序。 然后在循环中我弄清楚理想点是什么。 这使得排行榜不正确,因为最有可能打出最多洞的球员将处于领先地位......
希望这是有道理的,并希望得到帮助... :-)
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
我不太确定你是否要求一个公式来做出正确的排名,或者你是否想要一个方法来在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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.