Prvním krokem je výpočet avg_num_votes
a avg_rating
:
SELECT
SUM(totalVotes)/COUNT(*) AS avg_num_votes,
SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;
Pokud dokážete žít s malou chybou, může být dost dobré si to jednou za čas spočítat.
Nyní pomocí svého vzorce a výše uvedených hodnot můžete spustit dotaz na vážení. Jako malou optimalizaci předem vypočítám avg_num_votes * avg_rating
a nazvěte jej 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;
Upravit
Můžete to spustit jako spojení:
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;
Ale toto vypočítá součet a průměr na každý jednotlivý dotaz – říkáme tomu výkonnostní bomba.