2010-12-05 7 views
2

Я проектирую веб-сайт, который заказывает результаты по его голосам и возрасту.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) 

ответ

1

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

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

Я знаю, как создавать функции в PHP. Например, функция test() {... Однако будет ли это работать для запроса? функция rankalgorithm ($ a, $ u, $ d) { $ ts = $ a - 1262304001; $ x = $ u - $ d; if ($ x> 0) \t $ y = 1; elseif ($ 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 вовсе не рекомендуется. Потому что, если u делает это, единственный способ заставить его работать правильно - загрузить все строки и передать каждый из них через fn, чтобы сгенерировать ранг, а затем переупорядочить список с помощью рангов, а затем перерезать его на нужную страницу. это будет работать, если у вас всего меньше строк, например, 1000 строк или около того. bt если u имеет более 1 lakh строк и все. его невозможно запустить, поскольку у php будет нехватка памяти при загрузке всех строк. Итак, лучший способ сделать это - через mysql. Но вам не нужно идти с UDF как его значительно продвинутым. – 2010-12-05 20:00:39

0

Если вы хотите, чтобы s то здесь есть. Я просто написал это быстро и не получил времени, чтобы проверить его полностью. Я определенно надеюсь, что это сработает. :)

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 для вас. ;) ..