Mysql
 sql >> Base de données >  >> RDS >> Mysql

Évaluation MySQL avec pondération

Une première étape consiste à calculer avg_num_votes et avg_rating :

SELECT
  SUM(totalVotes)/COUNT(*) AS avg_num_votes,
  SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;

Si vous pouvez vivre avec une petite erreur, il peut être suffisant de la calculer de temps en temps.

Maintenant, en utilisant votre formule et les valeurs ci-dessus, vous pouvez exécuter la requête de pesée. Comme petite optimisation, je précalcule avg_num_votes * avg_rating et appelez-le 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;

Modifier

Vous pouvez exécuter ceci en tant que jointure :

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;

Mais cela calculera la somme et la moyenne sur chaque requête - appelez cela une bombe de performance.