2013-07-21 56 views
0

我想創建一個高爾夫的現場排行榜,它基於一個玩家有多少點等於理想點。把數學放到sql查詢

理想點是每個洞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); 

} 

在這個例子中我只是指望點和秩序。然後在循環中找出理想的要點。這使得排行榜不正確,因爲誰發揮最孔最有可能將在帶領玩家...

希望這是有道理的,並希望幫助... :-)

回答

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 
+0

哦,是的......工作就像一個魅力:-) – Mansa

0

我不太確定你是否要求一個公式來做出正確的排名,或者如果你只是想要一種方法來在SQL表達式中存在你現有的公式。我會先假設。

該公式幾乎是正確的。您還需要您的$idealpoints玩弄孔的數量劃分,這樣的:

$ idealpoints =($行[ '點'] - ($行[ '孔'] * 2))/ $行[ '孔'];

因此,您將得到您的排名可以基於的十進制值。價值越低 - 排名越好;如下例所示:

播放器1具有後2個孔(1比理想)==(5 - 4)5分/ 2 = 0,5 idealpoints。
玩家2在3洞後有7分(理想+1分) ==(7-6)/3=0.33理想分。

玩家2將排名更高,因爲他在三洞後只有+1。玩家1在兩個洞後已經+1了。