Я проектирую веб-сайт, который заказывает результаты по его голосам и возрасту.
Я нашел алгоритм 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 = AB X = UD Y = 1 if x>0 0 if x=0 -1 if x<0 z = max(abs(x),1)
Ну, если его я, я напишу UDF в MySQL, который может быть 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 для вас. 😉 ..