2008-09-30 3 views
8

मैं निर्धारित करने के लिए कितने वोट एक कहानी प्राप्त हुआ है निम्न क्वेरी मिल गया है:मैं गणितीय फ़ंक्शन को MySQL क्वेरी पर कैसे लागू कर सकता हूं?

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 

मैं आगामी कथाएँ (मुझे लगता है कि यह क्या reddit का उपयोग करता है) के लिए यह करने के लिए निम्न गणितीय समारोह लागू करना चाहते हैं - http://redflavor.com/reddit.cf.algorithm.png

मैं एप्लिकेशन पक्ष (जो अब मैं कर रहा हूं) पर फ़ंक्शन निष्पादित कर सकता हूं, लेकिन मैं इसे रैंकिंग द्वारा क्रमबद्ध नहीं कर सकता।

कोई सलाह?

उत्तर

4

इस प्रयास करें:

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 

आपको इस जानकारी की जाँच करने के लिए अगर यह आपके डेटासेट के साथ काम करता है की आवश्यकता हो सकती।

+0

इसके लिए धन्यवाद, मैंने कोशिश की लेकिन यह कहा "हर व्युत्पन्न तालिका में अपना स्वयं का उपनाम होना चाहिए" ... –

+0

क्षमा करें: एस अब तय – Jonathan

3

वाई और जेड मुश्किल हैं। आप एक्स के मूल्य के आधार पर एक विशिष्ट वापसी चाहते हैं। यह एक समारोह बनाने के लिए एक अच्छे कारण की तरह लगता है।

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

आप y के लिए 1 समारोह बनाने के लिए और जेड के लिए एक होना चाहिए। एक्स में गुजरें, और एक नंबर पीछे की उम्मीद है।

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; 

वाई है। मैंने इसे जांच के बिना हाथ से किया ताकि आपको कुछ टाइपो को ठीक करना पड़े। वही तरीके से ज़ेड करें, और फिर आपके अंतिम फ़ंक्शन के लिए आपके पास सभी मान हैं।

+0

मैं आपको यह लिंक भी देना भूल गया था http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html कि आपको पेट के लिए पहिया को फिर से शुरू करने की आवश्यकता नहीं है , और इसी तरह। पी। मैं <3 सिद्धांत सेट करें। –

+0

=) धन्यवाद, मैं इसे भी एक कोशिश देने वाला हूं। –