Ett första steg är att beräkna avg_num_votes
och avg_rating
:
SELECT
SUM(totalVotes)/COUNT(*) AS avg_num_votes,
SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;
Om du kan leva med ett litet fel kan det vara bra att räkna ut det då och då.
Nu med din formel och värdena ovan kan du köra vägningsfrågan. Som en liten optimering förberäknar jag avg_num_votes * avg_rating
och kalla det 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;
Redigera
Du kan köra detta som en join:
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;
Men detta kommer att beräkna summa och medelvärde för varje enskild fråga - kalla det en prestandabomb.