[MySQL] AVG() met voorwaarden

Pagina: 1
Acties:

  • R0berto
  • Registratie: Augustus 2003
  • Laatst online: 02-02 21:18
ik heb een query die voor mij de gemiddelde tijd ophaalt die mensen nodig hebben gehad om vragen te beantwoorden.
code:
1
2
3
4
"SELECT antwoorden.*,
    AVG(`tijden`.`vraag1`) AS `avg_vraag1`,
    AVG(`tijden`.`vraag2`) AS `avg_vraag2`
GROUP BY `groupbycolumn`"

dat werkt allemaal als een zonnetje...

het probleem is als volgt: die vragen zijn gekoppeld aan een tabel met de antwoorden die gegeven zijn. Ik wil alleen de tijd meerekenen als het antwoord goed is, en niet als die fout is natuurlijk.
maar als een persoon vraag 1 fout heeft, en vraag 2 goed, dan moet vraag 2 wel meegerekend worden bij het gemiddelde van vraag 2, en vraag 1 niet bij het gemiddelde van vraag 1.... duidelijk nog hoop ik?? :P
code:
1
2
3
4
5
6
"SELECT antwoorden.*,
    AVG(`tijden`.`vraag1`) AS `avg_vraag1`,
    AVG(`tijden`.`vraag2`) AS `avg_vraag2`
WHERE `antwoorden`.`antwoord1` = 'goede antwoord' 
    AND `antwoorden`.`antwoord2` = 'goede antwoord 2' 
GROUP BY `groupbycolumn`"

die is dus niet goed, omdat hierbij ALLE antwoorden goed moeten zijn....

er is natuurlijk de mogelijkheid om alle kolommen apart te gaan ophalen, maar dat zou een nogal grote belasting op de server zijn....


Opbouw tabellen:

tbl tijden
--------
id
antwoord1
antwoord2
antwoord3
antwoord4
antwoord5
....

tbl antwoorden
-----------------
id
vraag1
vraag2
vraag3
vraag4
vraag5
....

[ Voor 5% gewijzigd door R0berto op 19-01-2006 08:31 . Reden: code netter neergezet ]


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

heb je een tabel waar de juiste antwoorden per vraag staan ?

zo ja: gebruik die tabel als koppeltabel in een left join; op die manier krijg je NULL waarden als het antwoord niet goed is, weet alleen niet hoe AVG daarmee omgaat...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-04 22:58

Janoz

Moderator Devschuur®

!litemod

Dat je je kolommen aan het nummeren bent is een teken van een slecht database model. Een slecht database model zorgt er (oa) voor dat queries lastiger danwel onmogelijk worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Aangezien AVG geen NULL's meeneemt, moet je gewoon wat creatief zijn met CASE of IF:

AVG(CASE WHEN iets_dat_waar_moet_zijn THEN iets_dat_in_het_gemiddelde_mag ELSE NULL END)

Uiteraard niet vergeten het commentaar van Janoz te lezen, want hij heeft wel gelijk.