null-waarden tellen met Join-query
Per categorie zou ik de aantallen willen weten van:
- hoeveel deelnemers vorige editie (=13) hebben deelgenomen
- hoeveel deelnemers 2 edities (=12e) geleden hebben deelgenomen
- hoeveel deelnemers eerder hebben deelgenomen (<12)
- hoeveel deelnemers niet eerder hebben meegedaan.
Ik heb één tabel waarin alle deelname-gegevens staan, zoals deelnemerID, editie, inschrijvingsstatus, etc....
Onderstaande query heb ik inmiddels kunnen bakken, met hulp van topics die ik hier heb gevonden en wat eigen inzichten:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT
d.categorie,
SUM(IF(last.maxeditie=13,1,0)) AS hist1,
SUM(IF(last.maxeditie=12,1,0)) AS hist2,
SUM(IF(last.maxeditie<12,1,0)) AS hist3,
SUM(IF(last.maxeditie=NULL,1,0)) AS hist4
FROM
deelname AS d
LEFT JOIN
(SELECT
dlnmrID,
max(editie) AS maxeditie
FROM
deelname
WHERE
editie<14
AND meegereden=1
GROUP BY
dlnmrID
) AS last
ON
d.dlnmrID=last.dlnmrID
WHERE
d.editie=14
AND d.inschrijvingsstatus=1
GROUP BY
d.categorie
d.categorie,
SUM(IF(last.maxeditie=13,1,0)) AS hist1,
SUM(IF(last.maxeditie=12,1,0)) AS hist2,
SUM(IF(last.maxeditie<12,1,0)) AS hist3,
SUM(IF(last.maxeditie=NULL,1,0)) AS hist4
FROM
deelname AS d
LEFT JOIN
(SELECT
dlnmrID,
max(editie) AS maxeditie
FROM
deelname
WHERE
editie<14
AND meegereden=1
GROUP BY
dlnmrID
) AS last
ON
d.dlnmrID=last.dlnmrID
WHERE
d.editie=14
AND d.inschrijvingsstatus=1
GROUP BY
d.categorie
Het werkt, behalve de aantallen deelnemers die nooit eerder hebben deelgenomen worden niet geteld (veld hist4 is 0 voor alle categoriën). Naar mijn idee zijn dat null-waarden die ik moet tellen. Maar die null-waarden lijken weg te vallen door de GROUP BY d.categorie ??
Hoe is dat op te lossen?
Is mijn query meest makkelijke manier? Of kan het nog makkelijker?
Ik denk dat het met de Left Join of inner join heeft te maken (is dezelfde :P) Probeer het eens met een outer join.
Waarschijnlijk kan OUTER JOIN niet overweg met de items die bij SELECT staan?
Dat werkt
De query was me zo ingewikkeld dat ik aan zo'n detail nooit meer gedacht heb.
Bedankt!