2010-02-11 186 views
4

我正在有兩種用戶類型,普通網站成員和評委的競賽網站上工作。每個人都可以使用拖放工具按照他們選擇的順序排列特定比賽中的條目。當他們完成後,相關的參賽ID將附加一個排名值,然後可以用來確定比賽中的哪個參賽項目的平均得分最高。獲勝者實際上將通過平均每組的平均值來確定。MySQL按平均兩種平均值排序

我希望做的是以表格的形式顯示每個參賽作品的標題,然後顯示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

由於下面的答案,這兩個查詢工作就像一個冠軍。

回答

2

請注意以下事項:

  • 我假定存在成員場USER_TYPE存儲無論是「正常」或「法官

  • 我已經刪除了加盟數據和由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; 
+0

謝謝您的幫助在這裏的,這肯定是更近了一步。我不知道我是否完全清楚。我希望做的是以表格形式顯示特定比賽中每個參賽作品的題目,然後顯示3個值,該項目的avg_normal,該項目的avg_judge,然後將這兩個值相加併除以兩個,所以avg_normal和avg_normal各佔avg_all的50%。最後,通過avg_all對錶格進行排序。 avg_all =((avg_normal + avg_judge)/ 2) 更清楚了嗎?非常感謝您提供的任何洞察力 – noahkuhn 2010-02-12 03:20:56

+0

更新了查詢。希望這是你想要的。 – lins314159 2010-02-12 03:42:29

+0

似乎更接近,但我收到以下錯誤:(#1054 - '字段列表'中的未知列'avg_normal')。我在最初的問題中粘貼了最新的查詢,並輸入了相應的值 – noahkuhn 2010-02-12 04:04:39

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; 
+0

這是99%,我想我遇到了一個語法問題,等於= sign(CASE當group_id ='7'時,如果)。作爲一個測試,如果我改變它!=它工作,並給了我其他值,但它是,它只是返回NULL – noahkuhn 2010-02-12 04:51:34

+0

明白了,其中一個聯接有點關閉,我的錯,(左加入exp_members米ON t .author_id = m.member_id)應該是(LEFT JOIN exp_members m ON r.author_id = m.member_id)。謝謝 – noahkuhn 2010-02-12 05:00:18