4


0

MySQLは2つの平均の平均でソートします

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

私がしたいのは、特定のコンテストの各エントリをタイトルで示すテーブルになり、3つの値、そのエントリのavg_normal、そのエントリのavg_judge、そして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スコアの平均。

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

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

2 Answer


2


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

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

  • titles.titleのデータとグループ化への結合を削除しました それらがあなたの平均にどのように関連しているかはわかりません。

.

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;


1


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

SELECT aa.title,aa.avg_normal,aa.avg_judge,(aa.avg_normal + aa.avg_judge) / 2 AS avg_all
from
(
SELECT
t.title,
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
LEFT JOIN exp_members m
  ON t.author_id = m.member_id
WHERE r.contest_id IN ('22')
GROUP BY
  t.title
ORDER BY
 avg_all) as aa;