PHP MYSQL查询算法帮助

时间:2010-12-05 18:38:27

标签: php mysql algorithm

我正在设计一个网站,根据其投票和年龄订购结果。

我找到了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)

2 个答案:

答案 0 :(得分:1)

好吧,如果是我的话,我会在MySQL中编写一个名为reddit_algo的UDF,并使用它像

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

答案 1 :(得分:0)

如果你想要存储的功能,那么就在这里。我刚刚写得很快,没有时间完全检查它。我绝对希望这有效。 :)

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;

希望这会有所帮助。 :) ..如果你有关于如何使用存储函数的任何想法,并且都尝试google搜索。

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