La verdad, tu query no se entiende muy claramente, pero por sobre todo, tiene unos gravísimos errores conceptuales. Entre ellos se destaca un abuso de CONCAT, y el uso innecesario y erróneo del mismo, que sin lugar a dudas está haciendo juegos de relaciones totalmente incorrectos.
Para darte un ejemplo del dislate, en el FROM ese CONCAT podría perfectamente considerar iguales un par de valores como (23,4) y (2,34), por cuanto en el concat quedarían como "234" en ambos casos. Y es un error gigantesco.
Sin terminar de entender bien lo que quieres lograr con esa query, su sintaxis más cercana a la realidad sería mas o menos así:
Código MySQL:
Ver originalSELECT f1.nro_identificacion
, f1.tipo_identificacion
formulario_f1 f1
INNER JOIN formulario_f5 f5
ON (f1.nro_identificacion
= f5.nro_identificacion
AND f1.tipo_identificacion
= f5.tipo_identificacion
) INNER JOIN formulario_f4_f7 f4f7
ON (f1.nro_identificacion
= f4f7.nro_identificacion
AND f1.tipo_identificacion
= f4f7.tipo_identificacion
) f1.fecha_atencion
BETWEEN '2011-07-01' AND '2012-05-31' AND f4f7.tipo_esquema_indicado
= 1 AND f4f7.tipo_esquema_indicado
NOT IN (2 , 3) GROUP BY f1.nro_identificacion
, f1.nro_identificacion
;
Algo mucho más simple de lo que pones. Y más eficiente por muchas razones.
En cuanto a que te devuelva vacío, eso es solamente un problema de datos, no de sintaxis: No se cumplen las condiciones, pero sin ver los datos y las estructuras reales de las tablas es difícil saber qué estás relacionando mal.