Wie kann ich mathematische Funktion MySQL-Abfrage anwenden?
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?
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.