Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/02/2010, 17:47
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

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