Join geeft niet aantal plaatsen Over terug
sum(d.aantal) as tot, max - sum(d.aantal) as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Elke activiteit heeft een max(imum) aantal inschrijvingen. Ik wil graag het aantal open plekken weten.
Als er inschrijvingen zijn voor de activiteit krijg ik netjes het aantal: Over
Maar ik krijg bij activiteiten waar nog geen inschrijvingen zijn (tot => NULL) ook voor Max de waarde NULL
Is wel met php op te lossen, maar kan dit ook met sql ?
Nb. ander vraagje: ik vraag 2x hier naar sum(d.aantal) dat is overbodig werk maar als ik de 2e keer in plaats daarvan tot invul snapt hij dat niet ! ?
Gewijzigd op 09/05/2013 14:13:23 door - Roland -
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT a.id, a.max, d.act_id ,
COALESCE(sum(d.aantal), 0) as tot, max-COALESCE(sum(d.aantal),0) as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
COALESCE(sum(d.aantal), 0) as tot, max-COALESCE(sum(d.aantal),0) as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Wellicht ook zo, maar dat moet je even testen:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT a.id, a.max, d.act_id ,
COALESCE(sum(d.aantal), 0) as tot, max-tot as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
COALESCE(sum(d.aantal), 0) as tot, max-tot as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Verder behoor je je GROUP BY over alle niet aggregate kolommen te doen, dus niet alleen over a.id.
dat werkt !
Enig idee waar COALESCE voor staat ?
(ik heb ook IFNULL gevonden, lijkt het zelfde te doen ? )
Nb. ander vraagje: ik vraag 2x hier naar sum(d.aantal) dat is overbodig werk maar als ik de 2e keer in plaats daarvan tot invul snapt hij dat niet ! ?
Nee, dat werkt niet Erwin
In dit geval wil je dit omdat als er nog geen records in je gejoinde tabel zitten, dan krijg je NULL terug en alleen in dat geval wil je 0 en niet NULL.
Met IF kan het ook, COALESCE is vooral makkelijker als je drie of meer waardes wilt checken.
Wat je kan doen om die dubbele telling te vermijden is de telling in een subquery uit te voeren:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT a.id, a.max, d.act_id ,
COALESCE(totaal, 0) as tot, max-COALESCE(totaal,0) as Over
FROM activiteiten as a
LEFT JOIN (
SELECT SUM(aantal) AS totaal, act_id
FROM act_deelnemers
GROUP BY act_id
) d ON a.id=d.act_id
COALESCE(totaal, 0) as tot, max-COALESCE(totaal,0) as Over
FROM activiteiten as a
LEFT JOIN (
SELECT SUM(aantal) AS totaal, act_id
FROM act_deelnemers
GROUP BY act_id
) d ON a.id=d.act_id
Edit: laatste GROUP BY weggehaald, want die is dan niet meer nodig.
Gewijzigd op 09/05/2013 14:50:42 door Erwin H
dank,
subquery, vergeet ik vaak en denk misschien ook is (te) ingewikkeld..
Maar eigenlijk helderder en goed te testen !!
Een subquery mag dan misschien wel helderder zijn, maar is overbodig. de query zal er niet sneller van worden.