Een eerste stap is het berekenen van avg_num_votes
en avg_rating
:
SELECT
SUM(totalVotes)/COUNT(*) AS avg_num_votes,
SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;
Als je met een kleine fout kunt leven, is het misschien goed genoeg om dat af en toe te berekenen.
Met behulp van uw formule en de bovenstaande waarden kunt u de weegquery uitvoeren. Als kleine optimalisatie bereken ik vooraf avg_num_votes * avg_rating
en noem het 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;
Bewerken
Je zou dit als een join kunnen uitvoeren:
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;
Maar dit berekent de som en het gemiddelde van elke afzonderlijke zoekopdracht - noem het een prestatiebom.