2010-12-05 15 views
2

Je suis un concepteur d'un site Web qui ordonne des résultats sur ses votes et ses âges.PHP MYSQL Query Algorithm Aide

J'ai trouvé l'algorithme reddit et je pense que c'est le meilleur à utiliser. Cependant, je ne sais pas comment l'implémenter en php. J'ai cherché google sur la façon de le faire mais je ne trouve aucun résultat. Je ne sais pas si c'est juste méchant parce que je ne sais pas exactement ce que je devrais chercher.

Je connais le PHP de base mais y a-t-il un moyen de le faire d'une manière simple.

Est-il possible de le faire comme ceci:

"SELECT * FROM table ORDER BY algorithm_here DESC";

L'algorithme de reddit est la suivante:

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) 

Répondre

1

Eh bien, si son moi, je vais écrire une UDF dans MySQL appelé peut être reddit_algo ou quelque chose et l'utiliser comme

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

Je sais comment créer des fonctions en PHP par exemple function test() {... Cependant, cela fonctionnerait-il pour la requête? algorithme de classement de fonction ($ 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); rang $ = log10 ($ z) + (($ y * $ ts)/45000); impression (rang $); } – Xplane

+0

la création d'une fonction dans php n'est pas du tout conseillée. Parce que si vous le faites, la seule façon de le faire fonctionner correctement est de charger toutes les lignes et de passer chacune à travers le fn pour générer le rang et ensuite réorganiser la liste en utilisant les rangs et ensuite le découper à la page nécessaire. cela fonctionnera si vous avez seulement moins de lignes comme un total de 1000 lignes ou plus. bt si vous avez plus de 1 rangs lakh et tout. il est impossible de l'exécuter car php manquera de mémoire lors du chargement de toutes les lignes. Donc, la meilleure façon de le faire est via mysql. Mais vous ne devez pas aller avec UDF comme considérablement avancé. –

+0

donc vous pouvez soit riter la fonction eux-mêmes ou écrire une fonction stockée. Mais les UDF sont beaucoup plus rapides que la bth. –

0

Si vous voulez le s fonction stockée alors voilà. Je viens de l'écrire rapidement et n'a pas eu le temps de le vérifier pleinement. J'espère vraiment que cela fonctionne. :)

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; 

Espérons que cela aide. :) .. si vous avez des doutes sur la façon d'utiliser une fonction stockée et tous essayer google recherche.

Puis à nouveau. Je tiens encore à le dire à nouveau, il n'est pas possible d'utiliser une fonction stockée ou une telle chose si vous avez une grande base de données. Donc, je recommande fortement d'écrire un fichier UDF. Si vous ne savez pas comment le faire; Ensuite, ajustez pour le moment cette fonction et lorsque la charge augmente et que vous commencez à gagner beaucoup de revenus, demandez à quelqu'un d'écrire une fonction UDF pour vous. ;) ..

+0

Je vais essayer cela et voir si cela fonctionne. Si ça ne me dérange pas, je trouverai un moyen. En tout cas, merci pour toute votre aide il a aidé mon beaucoup – Xplane

+0

vous êtes les bienvenus. :) .. au fait, si cela ne fonctionnait pas s'il vous plaît ne vous dérange pas de revenir 2 moi. :) .. im plus qu'heureux d'offrir de l'aide je peux :) –

+0

Si cela ne fonctionne pas, je vais utiliser un algorithme Bayseian simple au lieu de cet algorithme "complexe". – Xplane