2008-09-30 7 views
8

Ich habe die folgende Abfrage, um festzustellen, wie viele Stimmen bekommt eine Geschichte erhalten hat:Wie kann ich mathematische Funktion auf MySQL-Abfrage anwenden?

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 würde die folgende mathematische Funktion, um es für die kommenden Geschichten anzuwenden (ich glaube, es ist das, was reddit verwendet) -

Ich kann die Funktion auf der Anwendungsseite durchführen (was ich gerade mache), aber ich kann es nicht nach der Rangfolge sortieren, die die Funktion bietet.

Irgendwelche Ratschläge?

Antwort

4

Try this:

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 

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

+0

Danke dafür, ich habe es versucht, aber es hieß "Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben" ... –

+0

Sorry: S jetzt behoben – Jonathan

3

y und z sind die heiklen. Sie möchten eine bestimmte Rendite basierend auf dem Wert von x. Das klingt nach einem guten Grund, eine Funktion zu erfüllen.

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. gebe x ein und erwarte, dass eine Zahl zurückgeht.

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; 

Da ist y. Ich habe es manuell gemacht, ohne es zu überprüfen, also müssen Sie vielleicht ein paar Tippfehler beheben. Tun Sie das Gleiche, und dann haben Sie alle Werte für Ihre letzte Funktion.

+0

Ich habe vergessen, Ihnen diesen Link auch http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html zu geben, dass Sie nicht das Rad für abs neu erfinden müssen , und so weiter. p.s. I <3 Mengenlehre. –

+0

=) Danke, ich werde es auch versuchen. –

Verwandte Themen