MySQL按平均两个平均值排序

时间:2010-02-11 22:25:34

标签: sql mysql sorting average

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

我希望做的是最终得到一个表格,显示特定比赛中的每个条目,带有标题,然后显示3个值,该条目的avg_normal,该条目的avg_judge,然后将这两个值加在一起,除以2,所以avg_normal和avg_judge各占50%的avg_all。最后,通过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。)普通用户平均投票得分

2.)平均JUDGE用户投票得分

3。)NORMAL和&的平均值。 JUDGE SCORE。

所以普通用户平均值= 93.3333,法官平均值= 70,总平均值= 81.66665

感谢下面的答案,两个查询都像冠军一样。

2 个答案:

答案 0 :(得分: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 :(得分: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;