Първата стъпка е да изчислите avg_num_votes
и avg_rating
:
SELECT
SUM(totalVotes)/COUNT(*) AS avg_num_votes,
SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;
Ако можете да живеете с малка грешка, може да е достатъчно добре да я изчислявате от време на време.
Сега, като използвате вашата формула и стойностите по-горе, можете да изпълните заявката за претегляне. Като малка оптимизация предварително изчислявам avg_num_votes * avg_rating
и го наречете 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;
Редактиране
Можете да стартирате това като присъединяване:
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;
Но това ще изчисли сумата и средната стойност за всяка отделна заявка - наречете го бомба за производителност.