2010-02-11 4 views
4

Я работаю на сайте конкурса, где есть два типа пользователей, обычные участники сайта и судьи. Каждый может использовать инструмент перетаскивания, чтобы заказывать записи в конкретном конкурсе в том порядке, в котором они выбирают. Когда они будут сделаны, соответствующие идентификаторы входа будут привязаны к ранжированию, которое затем может быть использовано для определения того, какая запись в конкурсе получила наивысший средний балл. Победитель фактически будет определяться путем усреднения средних значений для каждой группы.MySQL сортирует в среднем по двум средним значениям

Что я надеюсь сделать, это таблица с указанием КАЖДОЙ записи в конкретном конкурсе с названием, а затем показать 3 значения, avg_normal для этой записи, avg_judge для этой записи, а затем эти два значения, добавленные вместе и делится на два, поэтому 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.) Средний балл оценки пользователя NORMAL

2.) средняя оценка пользователей СУДЬЯ оценка

3.) Среднее значение NORMAL & СУДЬИ SCORE.

Так Нормальный средний пользователь = 93,3333, судья средний = 70, Total Average = 81.66665

Благодаря ответы на приведенные ниже, оба запроса работают как чавканье.

ответ

2

Пожалуйста, обратите внимание на следующее:

  • Я предположил, что существует поле user_type в элементах, которые хранятся либо «NORMAL» или «СУДЬЯ»

  • Я удалил присоединиться к данных и группы по титрам.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

Спасибо за вашу помощь здесь, это, безусловно, шаг ближе. Я не знаю, был ли я совершенно ясен. То, что я надеюсь сделать, - это получить таблицу, показывающую EACH запись в конкретном конкурсе, с заголовком, а затем показать 3 значения, avg_normal для этой записи, avg_judge для этой записи, а затем эти два значения, добавленные вместе и деленные на два, поэтому avg_normal и avg_normal каждая учетная запись составляют 50% от avg_all. Наконец, отсортируйте таблицу по 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 = (CASE WHEN group_id = '7' THEN IF). В качестве теста, если я изменю его на! = Он работает и дает мне другие значения, но как есть, он просто возвращает NULL – noahkuhn

+0

Получил это, одно из соединений было немного выключено, моя ошибка (ЛЕВЫЙ ПРИСОЕДИНЕНИЕ exp_members m ON t .author_id = m.member_id) должно быть (LEFT JOIN exp_members m ON r.author_id = m.member_id). СПАСИБО – noahkuhn