4

我正在一个竞赛网站上工作,该网站有两种类型的用户,普通网站成员和评委。每个人都可以使用拖放工具按照他们选择的顺序对特定比赛中的参赛作品进行排序。完成后,相关条目 ID 会附加一个排名值,然后可用于确定比赛中哪个条目获得最高平均分。获胜者实际上将通过平均每组的平均值来确定。

我希望做的是最终得到一个表格,显示特定比赛中的每个条目,带有标题,然后显示 3 个值,该条目的 avg_normal,该条目的 avg_judge,然后将这两个值相加并除以 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

请注意以下事项:

  • 我假设成员中有一个字段 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;
于 2010-02-12T00:48:33.970 回答
1

所有这些更改是否包含原始查询,lines314159 有大部分工作

选择 aa.title,aa.avg_normal,aa.avg_judge,(aa.avg_normal + aa.avg_judge) / 2 AS avg_all
从
(
选择
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
左连接 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')
通过...分组
  t.title
订购方式
 avg_all) 作为aa;
于 2010-02-12T04:25:28.773 回答