[英]PHP MYSQL Query Algorithm Help
我正在设计一个网站,根据其投票和年龄对结果进行排序。
我找到了reddit算法,我认为这是最好的用法。 但是,我不知道如何将其实现到php中。 我已经在Google搜索了如何执行此操作,但找不到任何结果。 我不知道这是否只是因为我不知道我应该搜索什么。
我知道基本的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)
好吧,如果是我,我会在MySQL中编写一个UDF,它可能是reddit_algo之类的东西,并像这样使用它
SELECT
*,
reddit_algo() as rating
FROM
`table`
ORDER BY
`rating`
LIMIT 30;
如果您想要存储的功能,那么就在这里。 我只是写得很快,却没有时间充分检查它。 我绝对希望这行得通。 :)
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函数。 ;)..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.