2008-09-30 30 views
8

Tengo la siguiente consulta para determinar cuántos votos ha recibido una historia:¿Cómo puedo aplicar la función matemática a la consulta MySQL?

SELECT s_id, s_title, s_time, (s_time-now()) AS s_timediff, 

(
(SELECT COUNT(*) FROM s_ups WHERE stories.q_id=s_ups.s_id) - 
(SELECT COUNT(*) FROM s_downs WHERE stories.s_id=s_downs.s_id) 
) AS votes 

FROM stories 

me gustaría aplicar la siguiente función matemática a ella para las próximas historias (creo que es lo que utiliza reddit) - http://redflavor.com/reddit.cf.algorithm.png

Puedo realizar la función en el lado de la aplicación (que estoy haciendo ahora), pero no puedo ordenarlo por la clasificación que proporciona la función.

¿Algún consejo?

Respuesta

4

Prueba esto:

SELECT s_id, s_title, log10(Z) + (Y * s_timediff)/45000 AS redditfunction 
    FROM (
    SELECT stories.s_id, stories.s_title, stories.s_time, 
    stories.s_time - now() AS s_timediff, 
    count(s_ups.s_id) - count(s_downs.s_id) as X, 
    if(X>0,1,if(x<0,-1,0)) as Y, 
    if(abs(x)>=1,abs(x),1) as Z 
    FROM stories 
    LEFT JOIN s_ups ON stories.q_id=s_ups.s_id 
    LEFT JOIN s_downs ON stories.s_id=s_downs.s_id 
    GROUP BY stories.s_id 
    ) as derived_table1 

Es posible que necesite para comprobar esta afirmación si se trabaja con sus conjuntos de datos.

+0

Gracias por esto, lo intenté pero decía "Cada tabla derivada debe tener su propio alias" ... –

+0

lo siento: S fijado ahora – Jonathan

3

yyz son las más complicadas. Desea un rendimiento específico basado en el valor de x. Eso suena como una buena razón para hacer una función.

http://dev.mysql.com/doc/refman/5.0/en/if-statement.html

Usted debe hacer 1 función para yy uno para z. pase en x, y espere que un número retroceda.

DELIMINATOR // 

CREATE FUNCTION y_element(x INT) 
    RETURNS INT 

BEGIN 
    DECLARE y INT; 

IF x > 0 SET y = 1; 
ELSEIF x = 0 SET y = 0; 
ELSEIF x < 0 SET y = -1; 
END IF; 

RETURN y; 

END //; 

DELIMINATOR; 

There is y. Lo hice a mano sin verificar, por lo que es posible que tengas que corregir algunos errores tipográficos. Haz z de la misma manera, y luego tienes todos los valores para tu función final.

+0

Me olvidé de darle este enlace también http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html que no tiene que reinventar la rueda para abs , y así. p.s. I <3 Set Theory. –

+0

=) Gracias, voy a probar esto también. –

Cuestiones relacionadas