SELECT i.descricao, count(p.*)
FROM pessoas p, intervalo i
WHERE (DATEDIFF(NOW(), dtnascimento) / 365.25) between i.idade_minima and i.idade_maxima
GROUP BY i.descricao
Fiz uma adaptação baseada nos exemplos mostrados e ficou:
select case when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) <= 17 then
'ate 18'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) between 18 and 30 then
'de 18 a 30'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) between 31 and 40 then
'de 31 a 40'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) between 41 and 50 then
'de 41 a 50'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) between 51 and 60 then
'de 51 a 60'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) between 61 and 70 then
'de 61 a 70'
when truncate(datediff(curdate(), c.data_nascimento) / 365.25, 0) > 70 then
'maior que 70'
end as faixa_idade
, count(c.id_candidato) as total,
from candidato c
group by 1;