2012-06-24 168 views
0

我正在編寫一個腳本,該腳本根據從MySQL表中獲取的值計算殺死率(KDR)。我正在修復別人的代碼。我已經設法讓大部分工作重新開始。但是,我在這裏卡住了。 KDR的計算方法是將所有殺傷力加起來,再除以玩家的死亡人數。但是,如果玩家從來沒有死過,那麼KDR就會以0出現。我需要一種方法來讀取0,在評估KDR時將其作爲1。我做了谷歌這一點,並試圖寫一個我可以使用的UDF,但唉,它沒有幫助。MySql SELECT查詢

下面是問題

function get_leaders($civ, $neu, $riv){ 
    $sSQL = "SELECT *, ((civilian_kills * _civ + neutral_kills * _neu + rival_kills * _riv)/deaths) as KDR 
       from sc_players 
       order by KDR DESC 
       LIMIT 100;"; 
+0

你可以寫一個MySQL函數來爲你做,或者只是用PHP來做。 –

回答

4

http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_if

SELECT *, 
IF(deaths,civilian_kills * $civ + neutral_kills * $neu + rival_kills * $riv)/deaths,1) as KDR 
from sc_players 
order by KDR DESC 
LIMIT 100 
+1

只記得那件事,很好的打電話給肖恩。 –

+1

是不是'SELECT *,IF(死亡== 0,1,((civilian_kills * $ civ + neutral_kills * $ neu + rival_kills * $ riv)/ deaths))' – Trey

+0

是的,它會的。出於某種原因,我沒有考慮比率和良好的捕捉。 –

1

SQL查詢我想你指的是除數應該被視爲1時爲0。在這種情況下,你會做

SELECT *, ((civilian_kills * $civ + neutral_kills * $neu + rival_kills * $riv)/
    (IF deaths = 0 THEN 1 ELSE deaths) 
) as KDR from sc_players order by KDR DESC LIMIT 100; 

假設死亡是非負的,你也可以這樣做:

SELECT *, ((civilian_kills * $civ + neutral_kills * $neu + rival_kills * $riv)/
    GREATEST(deaths, 1) 
) as KDR from sc_players order by KDR DESC LIMIT 100; 
+0

你和我的解決方案中的初始理解一樣,但是如果你給它更多的想法 - KDR是殺人與死亡的比率。如果將分母視爲1而不是0,則最終返回玩家殺死的數量,而不是殺死率與預期的100%比率。 –

+0

如果在死亡率爲正數的情況下查看原始查詢,如果玩家比死亡人數多殺死,則答案大於1,所以我認爲您不希望爲從未死亡的人返回1 。 –

+0

是的。我想他想要的是每次死亡的平均殺傷率,在這種情況下,您的解決方案將是正確的。 –