mysql SUM() functie

Pagina: 1
Acties:

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 21:09

aex351

I am the one

Topicstarter
Ik heb wat problemen met een sql query. Ik probeer zoveel mogelijk te selecteren met 1 query als mogelijk en zo ook probeer ik de SUM( van het veld stemmen) te selecteren maar dit werkt niet. Ik krijg een error melding terug dat het gebruikt moet worden met GROUP BY. Op het internet kan ik hierover weinig referenties vinden en zou graag van iemand op dit forum willen horen waarom het onderstaande niet mogelijk is.

SQL:
1
2
3
4
5
    SELECT  *, poll.id as poll_id, SUM(poll_antwoord.stemmen) AS poll_totaal_stemmen
    FROM    poll, poll_antwoord 
    WHERE   poll.id = '$this->id' 
        AND poll.id = poll_antwoord.poll_id
        ORDER by poll_antwoord.id ASC

< dit stukje webruimte is te huur >


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Alle velden waarop je geen SUM,COUNT e.d. doet horen in een group by te staan, zodat MYSQL weer hoe hij moet groeperen en dus welke waardes hij wel en welke niet bij elkaar op te telelen.

Dus het gebruik van een * als select is vooral hier af te raden. ( in principe is een *-tje altijd af te raden in mijn mening )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 17:49

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:15
Kijk eerst eens wat het resultaat is als je die hele som weglaat. Je krijgt dan waarschijnlijk zo'n soort lijst resultaten:
poll_idantwoord_idstemmen
11123
12456
13789
24 60
25 40

(Er zijn dus twee polls; een met twee antwoorden en een met drie.)

Merk op dat er een resultaatrij is voor elk mogelijk antwoord. Als je hier een kolom 'som' aan zou toevoegen, wat zou daar dan in godsnaam in moeten staan? Er valt toch verder niets meer op te tellen?

Wat je wil hebben is een enkele rij per poll. Dan kun je namelijk wel op een zinnige manier een totaal berekenen. Je neemt alle rijen uit het bovenstaande resultaat met gelijke poll_id dus samen en telt hun stemmen op; poll_id is dus het veld waarop je wil groeperen.

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 21:09

aex351

I am the one

Topicstarter
Misschien wilde ik ook teveel uit 1 query halen. Mijn oorspronkelijke gedachtegang achter die query was dat het de kolom poll_totaal_stemmen aan de rechtere kant van de sql resultaten zou plakken. Maar iedere keer als ik dat probeerdere kreeg ik of 1 rij terug of wel alle rijen maar zonder de SUM van de rijen die ik wilde.

Ik heb nu dus maar een extra query gemaakt waarmee ik de SUM ophaal.

@Soultaker :
het is een query om alle gegevens van een poll op te halen om deze te weergeven.

[ Voor 13% gewijzigd door aex351 op 16-02-2006 19:28 ]

< dit stukje webruimte is te huur >


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:15
aex351 schreef op donderdag 16 februari 2006 @ 19:26:
Maar iedere keer als ik dat probeerdere kreeg ik of 1 rij terug of wel alle rijen maar zonder de SUM van de rijen die ik wilde.
Ah ja, ik zie nu dat je er nog een extra 'AND id=...' clausule bij hebt. Je wil dus inderdaad teveel uit de rijen halen - ofwel je haalt ze zelf op, ofwel je groepeert en ze en dan kun je er een aggregatiefunctie op toepassen (som, aantal, gemiddelde, minimum, maximum). Je kunt logischerwijs niet de som van een groep rijen ophalen zonder te groeperen, simpelweg omdat de som van de groep geen eigenschap is van de afzonderlijke rijen.

(Klinkt misschien wat ingewikkeld, maar denk er maar eens over na. Eigenlijk is het heel logisch.)
Ik heb nu dus maar een extra query gemaakt waarmee ik de SUM ophaal.
Dat is inderdaad wel een goede oplossing. Je kunt natuurlijk ook in de client (ik neem aan dat dat PHP code is) sommeren; de benodigde informatie heb je toch.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Aan gebrek van informatie gaan we dan maar gokken.
code:
1
2
3
4
5
6
SELECT     poll.id as poll_id, poll.vraag, poll_antwoord.AntwoordID, poll_antwoord.Antwoord, SUM(poll_antwoord.stemmen) AS poll_totaal_stemmen 
    FROM     poll, poll_antwoord  
    WHERE   poll.id = poll_antwoord.poll_id 
        AND      poll.id = '$this->id'  
GROUP BY poll.id as poll_id, poll_antwoord.AntwoordID, poll.vraag, poll_antwoord.Antwoord
ORDER by poll_antwoord.id ASC

Geeft je alle antwoorden van de poll met poll.id van $this->id, met de bijbehoorende antwoord en het aantal stemmen op dat antwoord.

Zoals gezegd, het * uit je query halen heeft soms een goed effect.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1