2012-06-24 4 views
0

J'écris un script qui calcule un Kill-Death Ratio (KDR) basé sur les valeurs obtenues à partir d'une table MySQL. Je corrige le code de quelqu'un d'autre. J'ai réussi à en faire fonctionner la plupart. Cependant, je suis coincé ici. Le KDR est calculé en additionnant tous les kills, et en divisant par le nombre de morts du joueur. Mais, si le joueur n'est jamais mort, alors le KDR sort à 0. J'ai besoin d'un moyen de lire le 0, comme un 1 lors de l'évaluation du KDR. J'ai fait google ceci, et ai essayé d'écrire un UDF que je pourrais employer, mais hélas cela n'a pas aidé.Requête MySql SELECT

est inférieure à la requête SQL en question

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

Vous pouvez écrire une fonction MySQL pour le faire pour vous, ou simplement le faire en PHP. –

Répondre

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

Rappelez-vous juste à ce sujet, bon appel Sean. –

+1

ne serait-ce pas 'SELECT *, SI (morts == 0,1, ((civil_kills * $ civ + neutral_kills * $ neu + rival_kills * $ riv)/morts))' – Trey

+0

oui, il le ferait. Pour une raison quelconque, je ne pensais pas en termes de ratios, de bonnes prises. –

1

Je pense que vous voulez dire que le diviseur doit être traité comme 1 quand il est égal à 0. Dans ce cas, vous feriez

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; 

En supposant que les décès est non négatif, vous pouvez également faire:

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

Vous avez eu la même compréhension initiale que dans ma solution, mais si vous y réfléchissez un peu plus, le KDR est le rapport entre les morts et les morts. Si vous traitez le dénominateur comme un 1 au lieu d'un 0, vous finissez par retourner le nombre de victimes du joueur plutôt que le ratio de 100% de morts-vivants comme prévu. –

+0

Si vous regardez la requête originale dans le cas où les morts sont positives, la réponse est supérieure à 1 si le joueur a plus de morts que de morts, donc je ne pense pas que vous voudriez retourner 1 pour quelqu'un qui n'est jamais mort . –

+0

True. Je suppose que ce qu'il veut, c'est la moyenne des morts par décès, auquel cas votre solution serait la bonne. –