2010-12-05 37 views
2

我是一个设计网站,订购其投票和年龄的结果。PHP MYSQL查询算法帮助

我找到了reddit算法,我认为这是最好的使用。但是,我不知道如何实现这个到php。我搜索了谷歌如何做到这一点,但我找不到任何结果。我不知道这是否意味着什么,因为我不知道我应该搜索什么。

但是我知道基本的PHP,有没有一种方法可以以一种简单的方式实现这一点。

是否有可能做这样的:

"SELECT * FROM table ORDER BY algorithm_here DESC";

的reddit的算法如下:

Log10(Z) + ((Y*Ts)/45000) = rank 

A = time posted 

B = 00:00:001 am 1/1/2010 

U = Up votes 

D = Down votes 



Ts = A-B 


X = U-D 


Y = 

1 if x>0 

0 if x=0 

-1 if x<0 


z = max(abs(x),1) 

回答

1

那么,如果它的我,我会写在MySQL的UDF称为可是reddit_algo什么的,就像

SELECT 
    *, 
    reddit_algo() as rating 
FROM 
    `table` 
ORDER BY 
    `rating` 
LIMIT 30; 
+0

我知道如何在PHP中创建函数,例如function test(){... 但是,这会为查询工作吗? ($ a,$ u,$ d){ $ ts = $ a - 1262304001; $ x = $ u - $ d; if($ x> 0) \t $ y = 1; ($ x = 0) \t $ y = 0; elseif($ x <0) \t $ y = -1; \t $ z = max(abs($ x),1); $ rank = log10($ z)+(($ y * $ ts)/ 45000); print($ rank); } – Xplane 2010-12-05 19:52:47

+0

在php中不创建函数并不是明智的。因为如果你这样做了,唯一能够正常工作的方法是加载所有行并通过fn传递每一行以生成等级,然后使用等级对列表重新排序,然后将其切片到所需的页面。 这将工作,如果你只有更少的行像1000行左右的总数。 BT如果你有超过10万行和所有。它不可能运行,因为PHP在加载所有行时会耗尽内存。 所以最好的办法是通过MySQL。 但是你不需要随UDF的进步,因为它相当先进。 – 2010-12-05 20:00:39

0

如果你想要s tored函数然后在这里。我只是写得很快,没有时间充分检查它。我绝对希望这有效。 :)

DELIMITER && 

DROP FUNCTION IF EXISTS reddit_rank && 

CREATE FUNCTION reddit_rank(time_posted TIMESTAMP, up_votes INT, down_votes INT) RETURNS NUMERIC(10,6) 
    DETERMINISTIC 

BEGIN 
    DECLARE start_time TIMESTAMP; 
    DECLARE Ts INT; 
    DECLARE vote_diff INT; 
    DECLARE y TINYINT; 
    DECLARE z1 INT; 
    DECLARE z INT; 
    DECLARE rank NUMERIC(10,6); 

    SET start_time = "2010-01-01 00:00:01"; 
    SET Ts = TIMESTAMPDIFF(SECOND,start_time, time_posted); 

    SET vote_diff = up_votes - down_votes; 

    IF vote_diff > 0 THEN 
     SET y = 1; 
    ELSEIF vote_diff < 0 THEN 
     SET y = -1; 
    ELSE 
     SET y = 0; 
    END IF; 

    SET z1 = ABS(vote_diff); 

    IF z1 >= 1 THEN 
     SET z = z1; 
    ELSE  
     SET z = 1; 
    END IF; 

    SET rank = LOG10(z) + ((y*Ts)/45000); 

    RETURN(rank); 

END && 

DELIMITER ; 

SELECT 
    *, 
    reddit_rank(`time_added`, `up_votes`, `down_votes`) as rank 
FROM 
    `table` 
ORDER BY 
    rank; 

希望这有助于。 :) ..如果你有任何方面如何使用存储的功能,并尝试谷歌搜索。

然后再次。我仍然想再说一遍,如果你有一个大型的数据库,那么使用存储函数或任何这样的东西都是不可取的。所以我强烈建议编写一个UDF。如果你不知道该怎么做;那么暂时用这个函数进行调整,当负载增加时,你开始赚取大量收入,让别人为你写一个UDF函数。 ;)..