4

私は、通常のサイト会員と審査員の 2 種類のユーザーがいるコンテスト サイトを運営しています。それぞれがドラッグ アンド ドロップ ツールを使用して、特定のコンテストのエントリを選択した順序で並べ替えることができます。それらが完了すると、関連するエントリ ID にランキング値が添付され、これを使用して、コンテストのどのエントリが最高の平均スコアを獲得したかを判断できます。勝者は、実際には各グループの平均を平均することによって決定されます。

私がやりたいことは、特定のコンテストの各エントリとタイトルを示す表を作成し、そのエントリの avg_normal とそのエントリの avg_judge の 3 つの値を表示し、次にこれら 2 つの値を合計して 2 で割った値を表示することです。であるため、avg_normal と avg_judge はそれぞれ avg_all の 50% を占めます。最後に、テーブルを avg_all で並べ替えます。

avg_all = ((avg_normal + avg_judge) / 2)

entry_ids 1、2、3、4、5 の順に並べます。ランキング値はゼロから始まるため、次のようになります。

entry_id, entry_ranking, author_id
1, 0, 1
2, 1, 1
3, 2, 1
4, 3, 1
5, 4, 1

1 から 100 のスケールで平均を決定したいと考えているので、エントリ ランキングは 0 = 100 ポイント、1 = 90、2 = 80、3 = 70、4 以上 = 5 ポイントです。

各ユーザーは別のテーブルのグループに関連付けられているため、通常のユーザーまたは審査員のいずれかになります。

検索クエリを記述できるようになりたい

1.) NORMALユーザーの平均投票スコア

2.) 平均 JUDGE ユーザー投票スコア

3.) NORMAL & JUDGE SCORE の平均。

したがって、通常のユーザーの平均 = 93.3333、ジャッジの平均 = 70、合計の平均 = 81.66665

以下の回答のおかげで、両方のクエリがチャンピオンのように機能します。

4

2 に答える 2

2

次の点に注意してください:

  • 「NORMAL」または「JUDGE」のいずれかを格納するフィールド user_type がメンバーにあると仮定しました

  • データへの結合と titles.title の group by を削除しました。これらが平均値とどのように関連しているかがわからないためです。

.

SELECT
  t.title,
  AVG(CASE WHEN user_type = 'NORMAL' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value = '4', 5, 0) END) AS avg_normal,
  AVG(CASE WHEN user_type = 'JUDGE' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value = '4', 5, 0) END) AS avg_judge,
  (AVG(CASE WHEN user_type = 'NORMAL' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value = '4', 5, 0) END) +
  AVG(CASE WHEN user_type = 'JUDGE' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value = '4', 5, 0) END)) / 2 AS avg_all
FROM rankings r
LEFT JOIN titles t
  ON r.entry_id = t.entry_id
LEFT JOIN members m
  ON t.author_id = m.member_id
WHERE r.contest_id IN ('CONTEST ID NUMBER')
GROUP BY
  t.title
ORDER BY
  avg_all;
于 2010-02-12T00:48:33.970 に答える
1

この変更はすべて、元のクエリをラップします。lines314159 には作業の大部分があります。

SELECT aa.title,aa.avg_normal,aa.avg_judge,(aa.avg_normal + aa.avg_judge) / 2 AS avg_all
から
(
選択する
タイトル、
AVG(CASE WHEN group_id = '6' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value >= '4', 5, 0) END) AS avg_normal,
AVG(CASE WHEN group_id = '7' THEN IF (r.ranking_value = '0', 100, 0) + IF (r.ranking_value = '1', 90, 0) + IF (r.ranking_value = '2', 80, 0) + IF (r.ranking_value = '3', 70, 0) + IF (r.ranking_value >= '4', 5, 0) END) AS avg_judge
FROM exp_rankings r
LEFT JOIN exp_weblog_titles t
  ON r.entry_id = t.entry_id
左結合 exp_members m
  ON t.author_id = m.member_id
WHERE r.contest_id IN ('22')
グループ化
  タイトル
オーダーバイ
 aaとして avg_all);
于 2010-02-12T04:25:28.773 に答える