Sum En count samen gaat niet goed?
maar zodra ik een count en een sum in dezelfde query gebruik.. gaat het mis.
de query:
Code (php)
1
2
3
4
5
6
7
8
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
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
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)
1
SELECT forum.forumid, forum.title, forum.link, count(post.postid) as postcount, sum(distinct thread.views) as views
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
Thijs Damen schreef op 10.01.2009 12:04:
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.ik neem aan dat het te maken heeft met ONLY_FULL_GROUP_BY?
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.
dan is de 'goeie' sql query het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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?
Thijs Damen schreef op 10.01.2009 13:33:
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?Nou, laten we er even vanuit gaan dat dat simpel weg niet mogelijk is.
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.