Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Classificação do MySQL com peso


Um primeiro passo é calcular avg_num_votes e avg_rating :
SELECT
  SUM(totalVotes)/COUNT(*) AS avg_num_votes,
  SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;

Se você pode viver com um pequeno erro, pode ser bom calculá-lo de vez em quando.

Agora usando sua fórmula e os valores acima, você pode executar a consulta de pesagem. Como uma pequena otimização eu pré-calculo avg_num_votes * avg_rating e chame-o de avg_summand
SELECT
  voting.*, -- or whatever fields you need
  ($avg_summand+totalVotes*avgVote)/($avg_num_votes+totalVotes) AS bayesian
FROM voting
ORDER BY  bayesian DESC
LIMIT 1;

Editar

Você pode executar isso como uma junção:
SELECT
  voting.*, -- or whatever fields you need
  (avg_num_votes*avg_rating+totalVotes*avgVote)/(avg_num_votes+totalVotes) AS bayesian
FROM voting,
(
  SELECT
    SUM(totalVotes)/COUNT(*) AS avg_num_votes,
    SUM(avgVote)/COUNT(*) AS avg_rating
  FROM voting AS iv
) AS avg
ORDER BY  bayesian DESC
LIMIT 1;

Mas isso calculará a soma e a média em cada consulta - chame isso de bomba de desempenho.