Frage

Ich habe die folgende Abfrage bekam, um zu bestimmen, wie viele Stimmen eine Geschichte erhalten hat:

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

Ich mag die folgende mathematische Funktion, um es für die kommenden Geschichten anzuwenden (ich glaube, es ist das, was reddit verwendet) - http://redflavor.com/reddit.cf.algorithm.png

Ich kann die Funktion auf der Anwendungsseite durchführen (was ich jetzt tue), aber ich kann es nicht durch das Ranking sortieren, die die Funktion bereitstellt.

Jede beraten?

War es hilfreich?

Lösung

Versuchen Sie folgendes:

    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

Sie müssen möglicherweise diese Aussage überprüfen, ob es mit Ihren Datensätzen arbeitet.

Andere Tipps

y und z sind die schwierig diejenigen. Sie wollen eine bestimmte Rendite bezogen auf den Wert von x. Das klingt wie ein guter Grund, eine Funktion zu machen.

http://dev.mysql.com/doc /refman/5.0/en/if-statement.html

Sie sollten 1-Funktion für y und eine für z machen. Pass in x, und erwartet, dass aus einer Reihe zurück.

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;

Es gibt y. Ich habe es von Hand, ohne zu überprüfen, so dass Sie ein paar Tippfehler haben beheben können. Sind z die gleiche Art und Weise, und dann haben Sie alle Werte für die endgültige Funktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top