2012-06-24 135 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

是的。我想他想要的是每次死亡的平均杀伤率,在这种情况下,您的解决方案将是正确的。 –