簡體   English   中英

PHP MYSQL查詢算法幫助

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM