Sum En count samen gaat niet goed?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thijs Damen

Thijs Damen

10/01/2009 11:36:00
Quote Anchor link
Ik dacht bezig te zijn met een simpele query. en opzicht werkt het ook allemaal.

maar zodra ik een count en een sum in dezelfde query gebruik.. gaat het mis.

de query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT forum.forumid, forum.title, forum.link, sum(thread.views) AS views, count(post.postid) AS post
  FROM forum
  JOIN thread
  ON thread.forumid = forum.forumid
  JOIN post
  ON post.threadid = thread.threadid
  GROUP BY forum.forumid
  LIMIT 0,30


nu, er zit ook een where bij en een order by. maar dat moet niet uitmaken

het probleem:
Stel. Threadid 2 heeft 100 views. maar, 3 posts. Ik count de posts (3) en sum de views (300) <-- !!?!?!?

Als ik de query uitvoer zonder count van post. krijg ik gewoon 100 te zien bij views. op deze manier. 300.. (zelfde geld voor andere forum ids, met 2 posts, vermenigvuldigd die de views met 2)

Mijn gok is dat het in de group by licht. maar hoe:s ik ben al een paar uurtjes bezig en kom er gewoon niet uit.

moet ik 2 querys gaan gebruiken?

bedankt alvast voor jullie eeuwige kennis :)
Gewijzigd op 01/01/1970 01:00:00 door Thijs Damen
 
PHP hulp

PHP hulp

24/11/2024 00:56:10
 
Frank -

Frank -

10/01/2009 11:51:00
Quote Anchor link
Welke database gebruik je? MySQL? Ga dan eerst je database maar eens configureren, MySQL weigert foutmeldingen te geven op foute queries met aggregate functies. http://wiki.phpfreakz.nl/Werken_met_MySQL
 
Thijs Damen

Thijs Damen

10/01/2009 12:04:00
Quote Anchor link
ja en nu,

ik neem aan dat het te maken heeft met ONLY_FULL_GROUP_BY?

maar, in andere woorden zeg je dat mn query verkeerd is. wat is er verkeerd aan mijn query dan.

als ik mijn group by's verander naar bijvoorbeeld postid dan zie ik dat per post het totale aantal views van de thread word genomen. dit wil ik dus voorkomen, kan dit?

ps.

het volgende lijkt het probleem op te lossen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT forum.forumid, forum.title, forum.link, count(post.postid) as postcount, sum(distinct thread.views) as views
(zie distinct)

maar goed dat zal mijn query niet beter maken (of wel ;))

dus nogmaals, wat is er dan precies mis in mijn query?
Gewijzigd op 01/01/1970 01:00:00 door Thijs Damen
 
Frank -

Frank -

10/01/2009 12:40:00
Quote Anchor link
Thijs Damen schreef op 10.01.2009 12:04:
ik neem aan dat het te maken heeft met ONLY_FULL_GROUP_BY?
Inderdaad, zolang je de server niet fatsoenlijk hebt geconfigureerd, heeft het weinig zin om een oplossing te gaan zoeken voor jouw probleem. MySQL verzint de grootst mogelijke onzin mocht er een query fout zijn, je kunt dus nauwelijks testen of de query wel goed is. Het heeft dan ook weinig zin om de query te gaan veranderen, wellicht zien we een foutje over het hoofd waar de database een foutmelding op hoort te geven.

Ga de ellende dus eerst maar configureren, dan komt een betere query later wel. En ga je niet beperken tot uitsluitend ONLY_FULL_GROUP_BY, alle volslagen idiote instellingen van MySQL zul je moeten aanpassen, je hebt een betrouwbare database nodig.
 
Thijs Damen

Thijs Damen

10/01/2009 13:33:00
Quote Anchor link
Nou, laten we er even vanuit gaan dat dat simpel weg niet mogelijk is.

dan is de 'goeie' sql query het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    SELECT COUNT(post.postid) AS postcount, thread.forumid, forum.title, forum.lastpost, forum.link, sum(distinct thread.views) as viewcount
    
    FROM " . TABLE_PREFIX . "post
    
        JOIN " . TABLE_PREFIX . "thread
        ON thread.threadid = post.threadid
        
        JOIN " . TABLE_PREFIX . "forum
        ON forum.forumid = thread.forumid

    WHERE post.dateline >= $dateline
    
    GROUP BY thread.forumid, forum.title, forum.lastpost, forum.link
    
    ORDER BY post.postid ASC
    
    LIMIT 0, 10


of niet?
 
Frank -

Frank -

10/01/2009 13:58:00
Quote Anchor link
Thijs Damen schreef op 10.01.2009 13:33:
Nou, laten we er even vanuit gaan dat dat simpel weg niet mogelijk is.
Hoe zeg je? Wanneer het niet mogelijk is om de database (runtime) te configureren, heeft het zelfs geen zin om verder te gaan met de query waar je nu problemen mee hebt. Deze resultaten zijn dan toch al onbetrouwbaar of zelfs corrupt, wat voor waarde wil je er dan nog aan toekennen?

De query ziet er wel een heel stuk beter uit, het aantal kolommen in het SELECT-gedeelte waar je geen aggregate functies op los laat, komt overeen met het aantal kolommen in de GROUP BY. Maar ja, zonder correcte data en zonder een controle op een geldige query kun je maar vrij weinig met deze resultaten.

Wanneer de database zelfs niet runtime is te configureren, dan gaan er wel een hele hoop dingen fout in jouw applicatie. Zodra iemand met kennis van zaken (beetje wiskunde is vaak al voldoende) dit gaat testen, zak je flink door het ijs.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.