2010-02-11 4 views
4

두 가지 유형의 사용자, 일반 사이트 멤버 및 심사 위원이있는 컨테스트 사이트에서 작업하고 있습니다. 각자는 드래그 앤 드롭 도구를 사용하여 특정 컨테스트의 항목을 선택한 순서대로 정렬 할 수 있습니다. 작업이 완료되면 관련 엔트리 ID가 첨부 된 순위 값을 사용하여 컨테스트에서 가장 높은 평균 점수를 얻은 항목을 결정하는 데 사용할 수 있습니다. 승자는 실제로 각 그룹의 평균을 평균하여 결정됩니다.MySQL은 평균 두 개의 평균으로 정렬합니다.

제목이있는 특정 컨테스트의 각 항목을 보여주는 표가 끝나면 해당 항목에 대해 avg_normal, 해당 항목에 대해 avg_judge, 그 다음 두 값이 함께 추가 된 3 개의 값이 표시됩니다. avg_normal과 avg_judge는 각각 avg_all의 50 %를 차지합니다. 마지막으로 avg_all로 테이블을 정렬하십시오.

avg_all = ((avg_normal avg_judge +)/2)

그들은 순서 entry_ids 1, 2, 3, 4, 5를 주문한다. 그래서 0 = 100 포인트의 엔트리 순위 = 90 1 = 80 (2), (3),

entry_id, entry_ranking, author_id 
1, 0, 1 
2, 1, 1 
3, 2, 1 
4, 3, 1 
5, 4, 1 

I는 1-100의 규모에 평균 결정하기 바라고 : 순위 값이므로 0에서 시작 = 70, 아무것도 위의 4 = 5 점

각 사용자가 다른 테이블에서 그룹에 부착, 그래서 그들은 일반 사용자, 또는

내가 쿼리를 쓸 수 있기를 원하는 판사 중 하나입니다된다 발견 수

1) 평균 NORMAL 사용자 투표 점수

2) 평균 JUDGE 사용자 투표 점수

3) 평균 평균 & 판정 점수.

그래서 일반 사용자 평균 = 93.3333, 판사의 평균 = 70, 아래의 답변에 81.66665

감사 총 평균 =이 두 쿼리는 챔피언처럼 작동합니다.

답변

2

다음에주의하십시오 :

  • 나도 'NORMAL'또는 '판사가'

  • 나는 조인 삭제 한 저장 회원의 필드 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

여기 당신의 도움을 주셔서 감사 작업의 대부분을 가지고, 원래 쿼리를 포장 않습니다, 이것은 걸음 더 가까이 확실히이다. 내가 충분히 명확한 지 모르겠다. 내가 원하는 것은 특정 콘테스트의 각 항목을 제목과 함께 보여주는 표로 끝난 다음 해당 항목에 대해 avg_normal, 해당 항목에 대해 avg_judge, 그 다음 두 값을 더하고 나누어 3 개의 값을 표시하는 것입니다. 2, 그래서 avg_normal과 avg_normal은 각각 avg_all의 50 %를 차지합니다. 마지막으로 avg_all로 테이블을 정렬하십시오. avg_all = ((avg_normal + avg_judge)/2) 더 명확합니까? 제공 할 수있는 통찰력을 가져 주셔서 대단히 감사합니다. – noahkuhn

+0

쿼리가 업데이트되었습니다. 희망이 당신이 원하는 것입니다. – lins314159

+0

가까이, 나는 다음과 같은 오류가 발생합니다 : (# 1054 - '필드 목록'에서 알 수없는 열 'avg_normal'). 원래 질문에 내 최신 쿼리를 적절한 값 – noahkuhn

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 %이며, 저는 equals = sign (CASE WHEN group_id = '7'인 경우). 내가 그것을 변경하면 테스트! = 그것은 작동하고 다른 값을 제공하지만 그대로 NULL을 반환합니다 – noahkuhn

+0

조인 중 하나가 조금 떨어져, 내 잘못, (LEFT JOIN exp_members m ON t .author_id = m.member_id)는 (LEFT JOIN exp_members m ON r.author_id = m.member_id) 여야합니다. 고맙습니다 – noahkuhn

관련 문제