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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top