2012-06-24 2 views
0

MySQL 테이블에서 얻은 값을 기반으로 Kill-Death Ratio (KDR)를 계산하는 스크립트를 작성했습니다. 나는 다른 사람의 암호를 고치고있다. 나는 그 중 대부분이 다시 작동하도록했습니다. 그러나, 나는 여기에서 붙어있어. KDR은 모든 살인을 추가하고 플레이어의 사망 수로 나누어 계산합니다. 하지만 플레이어가 죽지 않았다면 KDR은 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 (deaths == 0,1, ((civilian_kills * $ civ + neutral_kills * $ neu + rival_kills * $ riv)/죽음))가 아닐 것입니다. " – Trey

+0

예. 웬일인지 나는 비율에 관해 생각하고 있지 않았다, 좋은 붙잡음. –

1

에서 SQL 쿼리 나는 당신이이 경우 0 일 때 제수가 1로 처리한다는 의미는 생각, 당신은

할 것
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은 사망자 대 사망률의 비율입니다. 분모를 0 대신 1로 취급하면 예상대로 죽이기와 죽이기의 비율이 100 %가 아닌 플레이어의 사망 횟수가 반환됩니다. –

+0

사망자가 양수인 경우 원래 쿼리를 보면 플레이어가 사망자보다 더 많은 사망자가있는 경우 대답은 1보다 커서 따라서 사망 한 적이없는 사람에 대해 1을 반환하고 싶지는 않습니다. . –

+0

참. 그가 원하는 것은 죽음 당 죽음의 평균입니다.이 경우 당신의 해결책은 올바른 것입니다. –