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 
내가 곧 이야기 (나는 그것이 레딧 사용하는 것을 생각)을 위해 여기에 다음과 같은 수학 함수를 적용 할

- 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

죄송합니다. S fixed now – Jonathan

3

y 및 z는 까다로운 것들입니다. x 값에 따라 특정 수익을 원합니다. 그것은 기능을 만드는 좋은 이유 인 것처럼 들립니다.

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

하면 예 1 개의 기능을해야하고, Z 하나. x로 전달하고 숫자를 되 찾을 것을 기대하십시오.

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; 

y가 있습니다. 나는 당신이 약간의 오타를 고쳐야 할지도 모를 정도로 점검하지 않고 손으로 그것을했다. 동일한 방법으로 z를 수행하면 최종 함수의 모든 값을 얻을 수 있습니다.

+0

이 링크도 잊어 버렸습니다. http://dev.mysql.com/doc/refman/5.0/ko/mathematical-functions.html 복근 용 바퀴를 재발 명할 필요가 없다고 , 등등. p.s. 나는 <3 이론을 세웠다. –

+0

=) 고마워, 나는 이것도 시도해 볼께. –