Bueno, si eso es lo que estás tratando de hacer, entonces el problema es muy obvio: Tu consulta contiene demasiadas subconsultas, cada una con una subconsulta anidada.
Es innecesario y terriblemente ineficiente. Estás recargando al parser a morir...
La única solución que tienes es replantearte toda la consulta, porque obviamente se puede hacer de otro modo.
Te doy una ayuda: Estas contando cantidades de instancias en las que se cumple un conjunto de condiciones, por lo que en realidad es posible que cada ocasión esté barriendo toda la tabla.
¿Por qué no hacer, entonces, que la recorra una sola vez?:
Código MySQL:
Ver original SUM(IF(id_tipo_examen
= 1 AND edad_paciente
> 24 AND edad_paciente
< 30 , 1, 0)) papsAntUno
, SUM(IF(id_tipo_examen
= 1 AND edad_paciente
> 29 AND edad_paciente
< 35 , 1, 0)) papsAntDos
, SUM(IF(id_tipo_examen
= 1 AND edad_paciente
> 34 AND edad_paciente
< 40 , 1, 0)) papsAntTres
, SUM(IF(id_tipo_examen
= 1 AND edad_paciente
> 39 AND edad_paciente
< 45 , 1, 0)) papsAntCuatro
, SUM(IF(id_tipo_examen
= 1 AND edad_paciente
> 45 AND edad_paciente
< 50, 1, 0)) papsAntCinco
, /* Aquí irían los siguientes casos hasta completar los resultados */
id_municipio
= pIdUnidad
AND
Tips:
- AS es una cláusula
obsoleta que sólo se conserva por compatibilidad. Es innecesaria.
-
No abuses de las subconsultas. No tiene sentido usarlas para crear
un sólo valor, el cual puede ser obtenido de una
función almacenada (sería más práctico). Una subconsulta tiene más sentido si la vas a usar para obtener
un conjunto de registros.
- Los rangos de edades como los has puesto son funcionales, pero es más óptimo usar
BETWEEN para eso:
Puede parecer lo mismo, pero para MySQL es más eficiente de ese modo, porque
internamente la implementación del BETWEEN usa diferentes métodos.