Consulta compuesta en MySQL

loveshino

Bovino adolescente
#1
Hola, Bakunos

Les traigo otro caso de miedo, al menos lo es para mi, porque no he dado pie con bola.

Tengo tres tablas que componen la descripción de casos de atención ciudadana, estas son las tablas de casos, de personas y de seguimiento. En la primera, llevo descripciones de problemática, ubicación y etc, etc. La segunda lleva registro de las personas beneficiadas con del caso con todos sus datos. La tercera, lleva registro de fecha y anotaciones sobre el caso (un historial, pues). Mi problema viene a la hora de generar los reportes, pues hago consultas con joins a fin de tener una salida de lo básico del caso (ubicacio, descripcion, nombre de uno de los beneficiarios, y el estado de la atención). Para el nombre del beneficicario no hay problema, porque el primer ingresado suele ser el representante, pero el problema viene cuando se trata del estatus, porque la consulta me devuelve el primer registro del caso (le fecha de alta), y por supuesto, necesito que saliera la fecha más reciente (o acaso el último registro en tabla).

Este es mi código:

SELECT
`caso`.`folio`, `caso`.`Id`, `caso`.`municipio`,
`caso`.`localidad`, `caso`.`redaccion`, `caso`.`sector`,
`referencia`.`nombre`, `referencia`.`cargo`,
`referencia`.`organizacion`, `referencia`.`direccion`,
`referencia`.`telefono`, `referencia`.`mail`, `seguimiento`.`fecha`,
`seguimiento`.`estado`, `seguimiento`.`nota`
FROM
`caso` LEFT JOIN
`referencia` ON `referencia`.`caso` = `caso`.`Id` LEFT JOIN
`seguimiento` ON `seguimiento`.`caso` = `caso`.`Id`
GROUP BY
`caso`.`folio`;

Por favor, amigos, este asunto ya me tiene mareado! Les garadezco mucho la atención.
 
#2
Pues se me ocurre que lo puedes hacer en el programa que lleva la base de datos, no hacer todos los JOINs y dependiendo del registro que estés buscando, agarrar la fecha más alta, pero esto es si tienes la posibilidad de delegarle algo de las tareas al software que estás desarrollando, sin embargo no sería útil si tienes que hacerlo estrictamente dentro de tu DBMS.

Otra que se me ocurre es funciones de agregación. Se pueden utilizar con fechas, sin embargo yo creo que tendrías que hacer un GROUP BY que satisfaga tus necesidades. Ya probaste usando la función de agregación MAX(Fecha)?

Saludos!
 

loveshino

Bovino adolescente
#3
Por supuesto que sí, Humberto. Probé usando Max en fecha, pero por supuesto, solo elige la fecha más reciente y no trae con ella los datos de nota o estado que corresponden a su registro, aparte, no puedo usar la funcion Max en los otros campos, ya que siendo textos, haría un revoltijo :p

Dentro del software que escribo, podría ser, lo que me inquieta sería hacer la cantidad de llamadas a la bd consecutivas (tengo que cubrir actualmente 4000 folios), mortal, no :p

De ahí mi deseo de tener toda la consulta lista para la aplicación :S
 

loveshino

Bovino adolescente
#4
Terminé implementando esto, subquerys correlacionadas. Me gustaría que alguien más experto en el caso me dijera si es fiable esta solución (por los recursos del server) o debo buscar más alternativas.

SELECT
`caso`.`Id`, `caso`.`folio`, `caso`.`municipio`,
`caso`.`localidad`, `caso`.`redaccion`, `caso`.`editor`,
`caso`.`rubro`, `referencia`.`nombre`,
`referencia`.`cargo`, `referencia`.`organizacion`,
`referencia`.`direccion`, `referencia`.`telefono`,
(SELECT `seguimiento`.`fecha` FROM `seguimiento`
WHERE `seguimiento`.`caso` = `caso`.`Id` ORDER BY
`seguimiento`.`Id` DESC LIMIT 1), (SELECT `seguimiento`.`estado`
FROM `seguimiento`
WHERE `seguimiento`.`caso` = `caso`.`Id` ORDER BY
`seguimiento`.`Id` DESC LIMIT 1), (SELECT `seguimiento`.`nota`
FROM `seguimiento`
WHERE `seguimiento`.`caso` = `caso`.`Id` ORDER BY
`seguimiento`.`Id` DESC LIMIT 1)
FROM
`caso` left JOIN
`referencia` ON `referencia`.`caso` = `caso`.`Id`
GROUP BY
`caso`.`folio`;
 
Arriba