Справка по алгоритму запросов PHP MYSQL - PullRequest
2 голосов
/ 05 декабря 2010

Я занимаюсь разработкой веб-сайта, который сортирует результаты по голосам и возрастам.

Я нашел алгоритм 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)

Ответы [ 2 ]

1 голос
/ 05 декабря 2010

Ну, если это я, я напишу UDF в MySQL, который может быть reddit_algo или что-то в этом роде, и использовать его как

SELECT
    *,
    reddit_algo() as rating
FROM
    `table`
ORDER BY
    `rating`
LIMIT 30;
0 голосов
/ 05 декабря 2010

Если вы хотите сохранить функцию, вот она.я только написал это быстро и не получил время, чтобы проверить это полностью.Я определенно надеюсь, что это работает.:)

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.;) ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...