Join geeft niet aantal plaatsen Over terug

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Roland -

- Roland -

09/05/2013 14:09:33
Quote Anchor link
SELECT a.id, a.max, , d.act_id ,
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 -
 
PHP hulp

PHP hulp

19/04/2024 21:29:30
 
Erwin H

Erwin H

09/05/2013 14:12:53
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Wellicht ook zo, maar dat moet je even testen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Verder behoor je je GROUP BY over alle niet aggregate kolommen te doen, dus niet alleen over a.id.
 
- Roland -

- Roland -

09/05/2013 14:26:13
Quote Anchor link
dank je,

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
 
Erwin H

Erwin H

09/05/2013 14:45:40
Quote Anchor link
COALESCE is een functie die de eerste meegegeven niet NULL waarde teruggeeft.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
COALESCE(NULL, 0) = 0;
COALESCE(100, 0) = 100;
COALESCE(100, NULL, 0) = 100;

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Edit: laatste GROUP BY weggehaald, want die is dan niet meer nodig.
Gewijzigd op 09/05/2013 14:50:42 door Erwin H
 
- Roland -

- Roland -

09/05/2013 15:54:50
Quote Anchor link
_ COALESCE is het engelse woord voor samenvoegen... :-)

dank,

subquery, vergeet ik vaak en denk misschien ook is (te) ingewikkeld..

Maar eigenlijk helderder en goed te testen !!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 18:40:14
Quote Anchor link
Een subquery mag dan misschien wel helderder zijn, maar is overbodig. de query zal er niet sneller van worden.
 



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.