我正在一个竞赛网站上工作,该网站有两种类型的用户:普通网站成员和评委。每个人都可以使用拖放工具按照他们选择的顺序对特定比赛中的参赛作品进行排序。完成后,相关条目 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.) 正常分数和裁判分数的平均值。

所以普通用户平均值 = 93.3333,判断平均值 = 70,总平均值 = 81.66665

感谢下面的答案,这两个查询都表现出色。

有帮助吗?

解决方案

请注意以下事项:

  • 我假设成员中有一个字段 user_type 存储“NORMAL”或“JUDGE”

  • 我删除了对数据的连接以及对标题的分组依据,因为我不明白它们与您的平均值有何相关。

.

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;

其他提示

所有这种改变它包裹原始查询,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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top