2010-12-05 55 views
2

我是一個設計網站,訂購其投票和年齡的結果。PHP MYSQL查詢算法幫助

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

回答

1

那麼,如果它的我,我會寫在MySQL的UDF稱爲可是reddit_algo什麼的,就像

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

我知道如何在PHP中創建函數,例如function test(){... 但是,這會爲查詢工作嗎? ($ a,$ u,$ d){ $ ts = $ a - 1262304001; $ x = $ u - $ d; if($ x> 0) \t $ y = 1; ($ 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中不創建函數並不是明智的。因爲如果你這樣做了,唯一能夠正常工作的方法是加載所有行並通過fn傳遞每一行以生成等級,然後使用等級對列表重新排序,然後將其切片到所需的頁面。 這將工作,如果你只有更少的行像1000行左右的總數。 BT如果你有超過10萬行和所有。它不可能運行,因爲PHP在加載所有行時會耗盡內存。 所以最好的辦法是通過MySQL。 但是你不需要隨UDF的進步,因爲它相當先進。 – 2010-12-05 20:00:39

0

如果你想要s tored函數然後在這裏。我只是寫得很快,沒有時間充分檢查它。我絕對希望這有效。 :)

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; 

希望這有助於。 :) ..如果你有任何方面如何使用存儲的功能,並嘗試谷歌搜索。

然後再次。我仍然想再說一遍,如果你有一個大型的數據庫,那麼使用存儲函數或任何這樣的東西都是不可取的。所以我強烈建議編寫一個UDF。如果你不知道該怎麼做;那麼暫時用這個函數進行調整,當負載增加時,你開始賺取大量收入,讓別人爲你寫一個UDF函數。 ;)..