Bước đầu tiên là tính toán avg_num_votes
và avg_rating
:
SELECT
SUM(totalVotes)/COUNT(*) AS avg_num_votes,
SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;
Nếu bạn có thể sống với một sai sót nhỏ, có thể đủ tốt để tính toán điều đó một lần.
Bây giờ sử dụng công thức của bạn và các giá trị ở trên, bạn có thể chạy truy vấn cân. Như một cách tối ưu hóa nhỏ, tôi tính toán trước avg_num_votes * avg_rating
và gọi nó là 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;
Chỉnh sửa
Bạn có thể chạy điều này với tư cách tham gia:
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;
Nhưng điều này sẽ tính toán tổng và trung bình trên mỗi truy vấn - gọi nó là một quả bom hiệu suất.