Todavía estoy tratando de entender lo que has puesto pero desde ya, a primera vista, es una consulta absolutamente redundante, como pocas veces he visto.
Si se analiza con cuidado pareciera que se está llamando cuatro veces al mismo modelo de consulta y cruzando las cuatro veces los mismos parámetros de JOIN.
En esencia, la consulta base sería esta:
Código MySQL:
Ver original AU.ID_auditoria,
TT.`Tipo de tarea`
auditorias AU
INNER JOIN `asignacion de tareas` AT
ON AU.ID_auditoria
= AT.Auditoria
INNER JOIN `tipos de tareas` TT
ON TA.Tipo
= TT.ID_tipo_tarea
LEFT JOIN avance AV
ON AT.Tarea
= AV.ID_asignacion
que parece destinada a obtener toda la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales no hayan tenido ningún avance.
Por otro lado se vuelve a cruzar con todas para conocer las tareas que
efectivamente hayan tenido un avance (en principio esto debería dar NULL lógicamente porque son incompatibles).
Luego tienes la segunda consulta, que en esencia parecer ser idéntica a la original, con sólo un cambio de orden de las tablas, como en el punto anterior...
Mira, si lo que quieres es obtener la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales hayan tenido
o no algún avance, la sentencia que debería lograrlo es la sentencia original con sólo un cambio:
Código MySQL:
Ver original AU.ID_auditoria,
TT.`Tipo de tarea`
auditorias AU
INNER JOIN `asignacion de tareas` AT
ON AU.ID_auditoria
= AT.Auditoria
INNER JOIN `tipos de tareas` TT
ON TA.Tipo
= TT.ID_tipo_tarea
LEFT JOIN avance AV
ON AT.Tarea
= AV.ID_asignacion
ORDER BY AU.ID_auditoria
, TT.ID_tipo_tarea
GROUP BY AU.ID_auditoria
, TT.ID_tipo_tarea
;
o bien hacer un UNION con dos consultas con las condiciones alternadas...
Explícame qué es exactamente lo que debe mostrar el reporte, a ver si por allí podemos reducir este código a algo menos redundante.