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. Buenos dias Mi problema es el siguiente tengo una base de datos con varias tablas de las cuales son las siguientes: Personal asignaciones vacaciones incapacidades ...
  #1 (permalink)  
Antiguo 14/02/2010, 11:34
 
Fecha de Ingreso: febrero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
problemas con consultas a base de datos

Buenos dias

Mi problema es el siguiente tengo una base de datos con varias tablas de las cuales son las siguientes:
Personal
asignaciones
vacaciones
incapacidades
castigos

el problema es el siguiente, necesito sacar un detalle total por persona teniendo en cuenta que la tabla personal esta enlazada a las otras tablas por medio del campo id, quisiera saber si esto es posible y como podria hacerse la consulta de antemano mil gracias
  #2 (permalink)  
Antiguo 14/02/2010, 12:44
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

Cita:
Iniciado por israel_u Ver Mensaje
Buenos dias

Mi problema es el siguiente tengo una base de datos con varias tablas de las cuales son las siguientes:
Personal
asignaciones
vacaciones
incapacidades
castigos

el problema es el siguiente, necesito sacar un detalle total por persona teniendo en cuenta que la tabla personal esta enlazada a las otras tablas por medio del campo id, quisiera saber si esto es posible y como podria hacerse la consulta de antemano mil gracias
Describe la estructura de las tablas y sus relaciones. Si n eso lo que das como info es insuficiente para crear ninguna consulta, porque ni siquiera estás aclarando el total de qué es lo que quieres...

Postea los CREATE TABLE delas tablas involucradas.
__________________
¿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 14/02/2010, 14:53
 
Fecha de Ingreso: febrero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: problemas con consultas a base de datos

ok disculpa ahi te pongo la estructura de las tablas :

Tabla personal
id ------------> clave principal
gafet
nombre
apellidos
direccion

Tabla asignacion
asigna_id ------------>clave primaria
id -----------> index y a la vez esta se relaciona con tabla personal
fecha1
desempeno

Tabla vacaciones
vac_id ----------------->clave principal
id ---------------->index y a la vez relacionada con personal
dias
periodo
asigna
fec_1
fec_2

Tabla incapacidades
incap_id ----------------------->Clave principal
id ----------------------->index y relacionada con personal
num_incap
doctor
dx
dias
fecha

Tabla castigos
cast_id ---------------->clave principal
id --------------->index y relacionada con la tabla personal
motivo
horas
fecha

lo anterior son las estructuras de las tablas con su clave principal e index y a la vez con que campos se relacionan, cabe mencionar que todas las tablas se relacionan con la tabla personal por medio del campo 'id'.

ahora lo que no he logrado es tener un detalle de movimientos totales de algun registro seleccionado de la tabla personal.

esto es que si en personal tengo registrado a Juan Perez, necesito saber cuantas veces y en que fechas lo asignaron a otras areas y cuantas veces y en que fechas tomo sus periodos de vacaciones, cuantas veces y en que fechas ha sido castigado y en que fechas, cuantas veces y en que fechas se ha incapacitado.


no se si esto sea posible por que he realizado varias consultas, pero no me muestra los resultados que necesito

muchas gracias por la atencion a mi pregunta
  #4 (permalink)  
Antiguo 14/02/2010, 17:47
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

Cita:
esto es que si en personal tengo registrado a Juan Perez, necesito saber cuantas veces y en que fechas lo asignaron a otras áreas y cuantas veces y en que fechas tomo sus periodos de vacaciones, cuantas veces y en que fechas ha sido castigado y en que fechas, cuantas veces y en que fechas se ha incapacitado.
Es posible, aunque en este caso la consulta será algo larga...

Por empezar, toda consulta que se refiera a un X conjunto de datos debe tener como primera tabla invocada, la que contenga la información básica, en este caso Personal, ya que es un reporte de todo el personal. Las diferentes tablas se van, entonces, refiriendo a ella en sucesivos JOIN, pero no cualquier JOIN, sino LEFT JOIN, ya que estos devolverán los datos de la tabla de la izquierda (la primera), haya o no coincidencias con la segunda (derecha).
Esto es primordial, porque debe devolver los miembros de personal, haya o no haya datos en las otras tablas, esto es, tenga o no asignaciones, castigos, etc.

Tip: Realiza las pruebas en forma incremental: Crea el primer JOIN y prueba que te de el resultado correcto. Luego toma ese JOIN y agrega el JOIN con la segunda tabla, prueba y luego recién ve sumando tablas una a una.
Es un recurso práctico.
No intentes, insisto no intentes escribir todo el JOIN con todas las tablas de entrada. Casi siempre hay errores que son difíciles de depurar.


Prueba:
Código MySQL:
Ver original
  1.      id,
  2.      gafet,
  3.      nombre,
  4.      apellidos,
  5.      direccion,  
  6.      COUNT(asigna_id) Asignaciones,
  7.      desempeno,  
  8.      fecha1
  9. FROM personal P LEFT JOIN asignaciones A ON P.id = A.id
  10. GROUP BY id, fecha1 WITH ROLLUP;

Este esquema se repetiría en todos los casos, más o menos igual.


Tip 2: No intentes hacer una sola consulta con todas las tablas si el resultado buscado es incompatible. En tu caso estás pidiendo 1) Cantidad y fechas de asignaciones a otras áreas. 2) Cantidad de días y fecha de inicio de vacaciones, y así todos los ítems.
Estos son conceptos incompatibles para realizar una sola consulta, porque estás pidiendo discriminación de días y eso devolverá una tabla con una columna de días, las que no se pueden compatibilizar con el resultado de las otras.
Para que se entienda: Para que una consulta devuelva un resultado en forma de tabla, debe existir una relación entre todos los campos de cada registro, y en este caso no lo habrá. La fecha de una infracción (supongamos línea 3), no tiene relación con la fecha de unas vacaciones que aparezcan en la misma línea...
¿Se comprende la idea?
El problema aquí es que si fuesen cantidades solamente, no habría inconveniente; pero tu pides las fechas discriminadas... y eso complica todo.
podría hacer es realizar un UNION consecutivo, devolviendo todas las informaciones, ya que la cantidad de columnas devueltas sería la misma... pero eso quedaría algo "sucio" como tabla
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 14/02/2010 a las 18:16
  #5 (permalink)  
Antiguo 14/02/2010, 20:30
 
Fecha de Ingreso: febrero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: problemas con consultas a base de datos

antes que nada te agradezco la atencion a mi pregunta, te comento que efectivamente ya habia realizado consultas con los diferentes JOIN y con UNION, pero he tenido un problema solo me devuelve informacion de la tabla personal con la primera tabla que una las demas no me las toma en cuenta y no me ha marcado ningun error, he realizado pruebas en mysql y ahi si me devulve todos los campos pero lo hago desde PHP y ahi es donde esta el problema

Cita:
SELECT personal.id, CONCAT_WS(' ',personal.gafet, personal.apellidos, personal.nombre) AS personal, castigos.cast_id, castigos.motivo, castigos.horas, castigos.fecha
FROM personal, castigos
WHERE personal.id= castigos.id
UNION
SELECT personal.id, CONCAT_WS(' ',personal.gafet, personal.apellidos, personal.nombre) AS personal, asignacion.asigna_id, asignacion.asignado, asignacion.fecha1, asignacion.desempeno
FROM personal, asignacion
WHERE personal.id= asignacion.id
como ejemplo relice esta consulta no me manda ningun error, pero solo me muestra la segunda parte de la consulta lo que esta con el Alias de personal y los campos de asignacion la parte de arriba de UNION esa no me la muestra, si esta consulta funcionara perfectamente pues podria agregar nuevas consultas con el condicional UNION, tal vez me puedas orientar en que parte de la consulta esta mal estructurada y sea el motivo por el cual solo me muestra la segunda parte, de antemano te lo agradezco infinitamente
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 18:02.