2010-02-11 10 views
4

Je travaille sur un site de concours où il y a deux types d'utilisateurs, les membres du site normal, et les juges. Chacun peut utiliser un outil de glisser-déposer pour commander les entrées d'un concours particulier dans l'ordre choisi. Une fois qu'ils ont terminé, les identifiants d'entrée correspondants sont associés à une valeur de classement qui peut ensuite être utilisée pour déterminer quelle entrée du concours a obtenu le score moyen le plus élevé. Le gagnant sera déterminé en faisant la moyenne des moyennes de chaque groupe. Ce que j'espère faire est de finir avec une table montrant CHAQUE entrée dans un concours particulier, avec le titre, et ensuite montrer 3 valeurs, avg_normal pour cette entrée, avg_juger pour cette entrée, puis ces deux valeurs ajoutées ensemble et divisé par deux, de sorte que les avg_normal et avg_juges représentent chacun 50% de l'avg_all. Enfin, trier la table par avg_all.MySQL trier par moyenne de deux moyennes

avg_all = ((avg_normal + avg_judge)/2)

Ils commandent entry_ids 1, 2, 3, 4, 5 dans l'ordre. La valeur de classement à partir de zéro alors:

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

je suis l'espoir de déterminer les moyennes sur une échelle de 1 à 100, de sorte qu'un rang d'entrée de 0 = 100 points, 1 = 90, 2 = 80, 3 = 70, et tout ce qui dépasse 4 = 5 points

Chaque utilisateur est attaché à un groupe dans une autre table, ils sont donc soit un utilisateur normal, ou un juge

Je veux être en mesure d'écrire une requête trouve

1.) La moyenne des votes des utilisateurs NORMAL

2.) Le vote utilisateur moyen JUDGE score de

3.) La moyenne du NORMAL & JUGE POINTAGE.

donc normal moyen utilisateur = 93,3333, moyenne Juge = 70, Total moyen = 81.66665

Merci aux réponses ci-dessous, les deux requêtes fonctionne comme un champion.

Répondre

2

S'il vous plaît noter les points suivants:

  • J'ai supposé qu'il ya un user_type sur le terrain dans les membres qui stocke soit « normale » ou « juge »

  • J'ai enlevé la jointure à Les données et le groupe de titres.title parce que je ne vois pas comment ils sont pertinents à vos moyennes.

.

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

Merci pour votre aide ici, cela est sans aucun doute un pas de plus. Je ne sais pas si j'étais assez clair. Ce que j'espère faire est de finir avec une table montrant CHAQUE entrée dans un concours particulier, avec le titre, puis montrer les 3 valeurs, avg_normal pour cette entrée, avg_juger pour cette entrée, puis ces deux valeurs additionnées et divisées par deux, donc les avg_normal et avg_normal représentent chacun 50% de l'avg_all. Enfin, trier la table par avg_all. avg_all = ((avg_normal + avg_juges)/2) Est-ce plus clair? Merci beaucoup pour toute idée que vous pouvez fournir – noahkuhn

+0

Mise à jour de la requête. J'espère que c'est ce que vous voulez. – lins314159

+0

Semble plus proche, j'obtiens l'erreur suivante cependant: (# 1054 - Colonne inconnue 'avg_normal' dans 'liste de champs'). J'ai collé ma dernière requête dans la question originale avec les valeurs appropriées – noahkuhn

1

Tout ce changement-t-il envelopper la requête initiale, lines314159 a la majeure partie du travail

 
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

Ceci est 99% là, je pense que je rencontre un problème de syntaxe avec le signe égal = QUAND group_id = '7' ALORS SI). Comme un test si je le change à! = Cela fonctionne et me donne les autres valeurs, mais tel quel, il retourne juste NULL – noahkuhn

+0

Got it, l'une des jointures était un peu éteint, ma faute, (LEFT JOIN exp_members m ON t .author_id = m.member_id) doit être (LEFT JOIN exp_members m ON r.author_id = m.member_id). JE VOUS REMERCIE – noahkuhn