Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/02/2010, 00:02
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemas con consultas a base de datos

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
  1.     P.gafet,
  2.     P.grado,
  3.     P.nombre,
  4.     P.apellidos,
  5.     C.cast_id,
  6.     C.motivo,
  7.     C.horas,
  8.     C.fecha,
  9.     A.asigna_id,
  10.     A.asignado,
  11.     A.fecha1,
  12.     A.desempeno
  13. FROM personal P
  14.     LEFT JOIN castigos C ON P.id = C.id
  15.     LEFT JOIN asignacion A ON P.id = A.id
  16.     P.id = colname
  17.     AND (C.id IS NULL OR A.id IS NULL );

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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)