我正在競賽網站上工作,有兩種類型的用戶,普通網站成員和評委.每個人都可以使用拖放工具按照他們選擇的順序對特定比賽中的條目進行排序.完成后,相關的條目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.)普通用戶投票得分
2.)JUDGE用戶平均投票得分
3.)NORMAL和&的平均值. JUDGE SCORE.
所以普通用戶平均值= 93.3333,法官平均值= 70,總平均值= 81.66665
感謝下面的答案,兩個查詢都像冠軍一樣.
解決方法:
請注意以下事項:
>我假設成員中有一個字段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;
標簽:mysql,sorting,sql,average
來源: https://codeday.me/bug/20190701/1343576.html