MySQL сортирует в среднем по двум средним - PullRequest
4 голосов
/ 12 февраля 2010

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

То, что я надеюсь сделать, это закончить таблицей, показывающей КАЖДУЮ запись в конкретном конкурсе, с заголовком, а затем показать 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.) Средняя НОРМАЛЬНАЯ оценка голосов пользователей

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

3.) Среднее из НОРМАЛЬНОГО И СУДЕБНОГО СЧЕТА.

Так нормально Средний пользователь = 93,3333, средний судья = 70, общий средний = 81,66665

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

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Обратите внимание на следующее:

  • Я предположил, что в элементах есть поле user_type, в котором хранится 'NORMAL' или 'JUDGE'

  • Я удалил объединение данных и группу по title.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 голос
/ 12 февраля 2010

Все эти изменения заключают в себе исходный запрос, строки314159 составляют основную часть работы

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;
...