Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

problemas con consultas a base de datos

Estas en el tema de problemas con consultas a base de datos en el foro de Bases de Datos General en Foros del Web. Hola que tal, aqui nuevamente en busca de asesoria ojala y me pudieran ayudar, tengo la siguiente consulta en la cual funciona perfectamente hasta mostrarme ...
  #1 (permalink)  
Antiguo 20/02/2010, 20:33
 
Fecha de Ingreso: febrero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
problemas con consultas a base de datos

Hola que tal, aqui nuevamente en busca de asesoria ojala y me pudieran ayudar, tengo la siguiente consulta en la cual funciona perfectamente hasta mostrarme los datos de las tres tablas solicitadas, pero al solicitar un registro en especial ya no me muestra nada quisiera saber cual seria la condicional para que me muestre un solo registro que yo le solicite esto es como ejemplo :

WHERE personal.id = colname

esto para solicitar el registro que se le solicite, cabe señalar que ya probe con la instruccion arriba mencionada y no me genera ningun resultado tampoco marca ningun error

Cita:

SELECT personal.gafet, personal.grado, personal.nombre, personal.apellidos, castigos.cast_id, castigos.motivo, castigos.horas, castigos.fecha, asignacion.asigna_id, asignacion.asignado, asignacion.fecha1, asignacion.desempeno
FROM personal
INNER JOIN castigos ON personal.id = castigos.id
INNER JOIN asignacion ON asignacion.id = personal.id
como siempre les estare muy agradecido para la atencion a esta pregunta gracias de antemano
  #2 (permalink)  
Antiguo 20/02/2010, 22:28
Avatar de 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

Suponiendo esto:
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.     INNER JOIN castigos C ON P.id = C.id
  15.     INNER JOIN asignacion A ON A.id = P.id
  16. WHERE P.id = colname;
Esto debería funcionar si existe un valore de ID que cumpla con los requisitos de los INNER JOIN y que sea igual a colname.

Ahora bien, ¿qué es colname?
¿Qué te devuelve si eliminas el WHERE P.id = colname?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/02/2010, 23:19
 
Fecha de Ingreso: febrero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: problemas con consultas a base de datos

Gracias por contestar siempre a mis preguntas te debo muchas, sabes buscandole por muchas partes pude resolver mi problema, ya me devuelve los datos que necesito por persona que necesito de la siguiente manera :
Cita:
SELECT personal.gafet, personal.grado, personal.nombre, personal.apellidos, castigos.cast_id, castigos.motivo, castigos.horas, castigos.fecha, asignacion.asigna_id, asignacion.asignado, asignacion.fecha1, asignacion.desempeno
FROM personal
INNER JOIN castigos ON personal.id = castigos.id
INNER JOIN asignacion ON asignacion.id = personal.id
WHERE personal.id=castigos.id AND asignacion.id=personal.id AND personal.id = colname
ahora contestando a tus preguntas colname es una variable en la cual me permite seleccionar en este caso todos los movimientos que tuvo cierta persona, osea que si selecciono a Juan Perez esta consulta me devuelve el detalle de castigos que tiene, asi como tambien me devuelve el detalle de asignaciones que ha desempeñado hasta aqui todo va muy bien.....................Ahora el problema que tengo es como poder mostrar los detalles de el mismo Juan Perez cuando alguna tabla no tenga registro alguno, te lo explico mas detalladamente Si juan Perez tiene en la tabla de castigos registros y en Asignaciones no tiene ningun registro me devuelve la consulta en blanco, pero en si en las dos tablas tiene registros si me muestra todos los detalles de Juan Perez tanto castigos como asignaciones, entonces lo que yo necesito es que me muestre los detalles aunque alguna de las tablas no tenga registros, quisiera saber como hacerle para que la consulta no me devuelva campos en blanco en caso de que alguna de las tablas no cuente con ellos, espero ser explicito con la pregunta y ojala puedas tu o alguna otra persona ayudarme con esta pregunta, asi mismo estoy para servirles en lo que pueda ayudarles ya que este foro me ha enseñado bastante
  #4 (permalink)  
Antiguo 21/02/2010, 00:02
Avatar de 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)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:14.