2012-06-24 3 views
0

Я пишу скрипт, который вычисляет коэффициент Kill-Death (KDR) на основе значений, полученных из таблицы MySQL. Я исправляю чей-то код. Мне удалось заставить большую часть работы снова работать. Однако я застрял здесь. KDR рассчитывается путем добавления всех убийств и деления на количество смертей игрока. Но если игрок никогда не умирал, тогда KDR выходит на 0. Мне нужен способ прочитать 0, как 1 при оценке KDR. Я сделал это в Google и попытался написать UDF, который мог бы использовать, но, увы, это не помогло.MySql SELECT query

Ниже приведен SQL-запрос в вопросе

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)/deaths))' – Trey

+0

да, это было бы. По какой-то причине я не думал о соотношении, хорошем улове. –

1

Я думаю, что вы имеете в виду делитель должен рассматриваться как 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

Правда. Я полагаю, что он хочет, это среднее число убийств на смерть, и в этом случае ваше решение будет правильным. –