Bueno, el tema es menos complicado que lo que parece: Para eso se usa un LEFT JOIN con ciertas condiciones.
El LEFT JOIN opera sobre la tabla a la izquierda (left) del join indicado, y devuelve todos los registros que la afecten, haya o no coincidencias en la segunda tabla (el RIGHT JOIN hace precisamente lo opuesto). El tema pasa porque hay que indicar específicamente que se debe considerar que no haya coincidencias, para que los registros por NULL puedan aparecer.
Así, pues, la consulta base sería algo así:
Código MySQL:
Ver original P.gafet,
P.grado,
P.nombre,
P.apellidos,
C.cast_id,
C.motivo,
C.horas,
C.fecha,
A.asigna_id,
A.asignado,
A.fecha1,
A.desempeno
P.id = colname
La idea es que la primera tabla tiene que tener todos los valores que se relacionarán, es decir, aquella tabla de la que se pretende hacer el reporte. La segunda y tercera tablas deben depender de ella. Si hay una dependencia entre la segunda y la tercera (donde la relación es transitiva) el caso se deberá analizar en especial.
¿Se comprende?
Es más fácil establecer los campos que deben dar NOT NUL de esa forma.
Tip: Por cuestiones de resolución lógica más clara, pon las igualdades del ON en la misma posición en que aparecen las tablas. Si A aparece antes que B, deben ir
A.id = B.id. Es más simple resolver la lógica si se mantiene una sintaxis consistente.
Detalle: Poner nuevamente las igualdades de los ON en el WHERE no resuelve nada. Solamente es redundante.