最初のステップは、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;
ただし、これにより、すべてのクエリの合計と平均が計算されます。これをパフォーマンス爆弾と呼びます。