Prueba este:
Código PHP:
Ver original$reporte_ultimos_dias = 7;
$lapso_de_intervalo = 2;
info.hashtag_content,
SUM(info.cantidad) menciones,
SUM( (info.intervalo_actual / ( TIMESTAMPDIFF( MINUTE,
DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
NOW()
) / $lapso_de_intervalo
)
) * info.cantidad
) puntuacion
FROM (
SELECT
hashtag_content,
CEIL( ( TIMESTAMPDIFF( MINUTE,
DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
hashtag_date
) / $lapso_de_intervalo)
) intervalo_actual,
COUNT(DISTINCT hashtag_id) cantidad
FROM hashtags
WHERE ( hashtag_date >= DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY) )
GROUP BY intervalo_actual, hashtag_content
HAVING intervalo_actual > 0
) info
GROUP BY info.hashtag_content
ORDER BY puntuacion DESC, menciones DESC, intervalo_actual DESC");
echo '<div><a href="/i/hashtag/'.$hashtag['hashtag_content'].'" class="hcolor">#'.$hashtag['hashtag_content'].' -> '.$hashtag['puntuacion'].'</a></div>'; ?>
retorna acertadamente los resultados en base a la prueba, habria que tener mas datos en la base como para probarlo mejor, la clave esta aca:
Código MySQL:
Ver original ) / $lapso_de_intervalo
)
) * info.cantidad
) puntuacion
esa suma es la quedes ir modificando para pulir al calculo lo mas posible, por ejemplo, si en vez de:
pones:
estaras diciendo que para entrar en el ranking, un hastag debe tener como minimo dos menciones (2-
1 > 0) por supuesto esto podrias parametrizarlo a una variable php, que para el script tal como esta ahora, valdria 0.
es cuestion de que cuando lo implementes, le hagas durante 1 o 2 semanas un seguimiento y lo vallas puliendo con detalles como el que te mencione.
La idea es que cuando el programa te retorne algo que no es lo esperado, mires los datos y te preguntes ¿Porque este elemento no debe tener (tanta|tan poca) puntuacion? y cuando encuentres esa respuesta, por ejemplo en el caso del ejemplo anterior seria: porque aun se lo menciono muy pocas veces vallas y hagas el retoque.
Puede pasar que una resta tan directa sea un metodo un poco agresivo, ya que aquellos que solo se los menciona menos de 2 veces por intervalo dejaran de figurar, asi que podrias suavizar esa penalizacion haciendo algo asi:
Código MySQL:
Ver original) * (info.cantidad
-(0.1*(IF(info.cantidad
= 1, 0.1, (1 / (info.cantidad
-1))))))
con lo cual ya tienes 2 parametros mas, el minimo de menciones (1) y el factor de penalizacion (0.1) donde aquellos que no alcancen el minimo de menciones reciben una penalizacion acorde al factor de penalizacion.
Las empresas que se dedican a estas cosas, llevan mucho tiempo realizando un seguimiento de los datos, comparando lo que sus programas devuelven con lo que deberian devolver y luego puliendo y mejorando algoritmos como este, dibujando los numeros de los informes y agregando decenas de parametros para torcer el ranking hacia donde ellos creen o consideran que es correcto.
(Por algo en twitter Obama mide mas que musicos o artistas famosos a nivel mundial, no es porque a la mayor parte del mundo le importe la politica y lo que Twitea el presidente de estados unidos, sino porque las empresas que arman los ranking "consideran..." que eso es lo que deberia ocurrir, y llevan meses perfeccionando sus codigos para que reflejen sus criterios.)
tu debes hacer lo mismo, de a poco ir agregando pequeños cambios y torciendo el informe hacia lo que tu consideres los resultados correctos, no tengas ninguna duda que si juntas a 10 personas, le muestras los mismos datos, tendras no menos de 5 opiniones diferentes de como deberian ordenarse