2

投票数に応じて重みのある評価を作成したい。したがって、5 票での 1 票は、4 票での 4 票よりも優れているとは言えません。

私はこの数学のフォームを見つけました:

bayesian = ( (avg_num_votes * avg_rating) + (this_num_votes * this_rating) ) / (avg_num_votes + this_num_votes)

最高評価の画像の ID を取得するために MySQL SELECT を作成するにはどうすればよいですか。

IMAGE 用のテーブルと VOTING 用のテーブルを取得しました

投票:

id
imageID
totalVotes
avgVote

SELECT in SELECT でこれを行う必要があると思いますが、どうすればよいですか?

4

1 に答える 1

1

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;

しかし、これはすべてのクエリで合計と平均を計算します-パフォーマンス爆弾と呼びます.

于 2012-11-22T12:30:34.233 に答える