Comment puis-je appliquer une fonction mathématique à une requête MySQL?
Question
J'ai la requête suivante pour déterminer le nombre de votes reçus par une histoire:
SELECT s_id, s_title, s_time, (s_time-now()) AS s_timediff,
(
(SELECT COUNT(*) FROM s_ups WHERE stories.q_id=s_ups.s_id) -
(SELECT COUNT(*) FROM s_downs WHERE stories.s_id=s_downs.s_id)
) AS votes
FROM stories
J'aimerais lui appliquer la fonction mathématique suivante pour les histoires à venir (je pense que c'est ce que reddit utilise) - http://redflavor.com/reddit.cf.algorithm.png
Je peux exécuter la fonction côté application (ce que je fais maintenant), mais je ne peux pas la trier en fonction du classement fourni par la fonction.
Un conseil?
La solution
Essayez ceci:
SELECT s_id, s_title, log10(Z) + (Y * s_timediff)/45000 AS redditfunction
FROM (
SELECT stories.s_id, stories.s_title, stories.s_time,
stories.s_time - now() AS s_timediff,
count(s_ups.s_id) - count(s_downs.s_id) as X,
if(X>0,1,if(x<0,-1,0)) as Y,
if(abs(x)>=1,abs(x),1) as Z
FROM stories
LEFT JOIN s_ups ON stories.q_id=s_ups.s_id
LEFT JOIN s_downs ON stories.s_id=s_downs.s_id
GROUP BY stories.s_id
) as derived_table1
Vous devrez peut-être vérifier cette instruction si elle fonctionne avec vos jeux de données.
Autres conseils
y et z sont les plus délicats. Vous voulez un retour spécifique basé sur la valeur de x. Cela semble être une bonne raison de créer une fonction.
http://dev.mysql.com/doc /refman/5.0/fr/if-statement.html
Vous devriez créer 1 fonction pour y et une pour z. passez dans x et attendez un nombre à sortir.
DELIMINATOR //
CREATE FUNCTION y_element(x INT)
RETURNS INT
BEGIN
DECLARE y INT;
IF x > 0 SET y = 1;
ELSEIF x = 0 SET y = 0;
ELSEIF x < 0 SET y = -1;
END IF;
RETURN y;
END //;
DELIMINATOR;
Il y a y Je l'ai fait à la main sans vérifier, vous devrez peut-être corriger quelques fautes de frappe. Faites z de la même manière, et vous aurez alors toutes les valeurs pour votre fonction finale.