MySQL - listar datos de dos tablas en funcion del valor de un campo de una tercera tabla

 
Vista:
sin imagen de perfil

listar datos de dos tablas en funcion del valor de un campo de una tercera tabla

Publicado por nicolas (7 intervenciones) el 18/11/2017 21:58:56
Hola Gente. Soy nuevo en este foro.
Espero que me puedan ayudar con el siguiente problema:

Tengo las siguiente tablas relacionadas por los campos encerrados con parentesis:

-admision_internacion (id, id_paciente)
-hc_internacion (id, id_admision)

-admision_guardia (id, id_paciente)
-hc_guardia (id, id_admision)

-diagnosticos (id, id_hc, tipo_hc{'hc_internacion','hc_guardia'}, id_cie)

La idea es mostrar los diagnosticos de un determinado paciente en los dos niveles de atencion (guardia e internacion) ordenados cronologicamente.
La consulta es la siguiente:

SELECT DISTINCT diag.id_cie, diag.tipo_hc
FROM diagnosticos AS diag, hc_guardia AS hcg, hc_internacion AS hci, admision_guardia AS admg, admision_internacion AS admi
WHERE admg.id_paciente=222 AND ((admg.id=hcg.id_admision AND hcg.id=diag.id_hc AND diag.tipo_hc='hc_guardia')
OR
(admi.id=hci.id_admision AND hci.id=diag.id_hc AND diag.tipo_hc='hc_internacion'))

La consulta funciona correctamente. El problema es que tarda una eternidad!, creo que es por cantidad de tuplas repetidas que realiza(por eso el DISTINCT en la clausula SELECT).

Existe alguna forma de optimizar esta consulta?. Intente con INNER JOIN pero no he tenido exito.

Agradeceria su ayuda colegas!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

listar datos de dos tablas en funcion del valor de un campo de una tercera tabla

Publicado por leonardo_josue (414 intervenciones) el 21/11/2017 21:52:51
Hola Nicolás:

Efectivamente, una forma de tratar de optimizar la consulta sería utilizar JOIN's, ya que estoy son más rápidos que las uniones explícitas, ¿podrías ponernos el código con los JOIN's? y si es posible, pon algunos datos de ejemplo de cada una de tus tablas, para poder ver cómo están relacionados.

También es recomendable el uso de índices, no solo sobre los campos llaves, sino también sobre el campo que estás utilizando para filtrar el tipo de diagnóstico. Postea el script de creación de tus tablas para revisar los índices.

También dinos, ¿de qué cantidad de registros estamos hablando? si son muchos (y por muchos me refiero a millones) es posible que sí se afecte el rendimiento, pero podrías utilizar algunas otras técnicas.

Finalmente, ejecuta el comando EXPLAIN sobre tu consulta y postea el resultado, así podemos revisar y darte alguna recomendación adicional.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

listar datos de dos tablas en funcion del valor de un campo de una tercera tabla

Publicado por nicolas (7 intervenciones) el 21/11/2017 23:22:37
Hola Leo. Primeramente muchas gracias por contestar.
Paso la consulta con Joins e imagenes con datos de ejemplo de cada tabla:

ATENCION EN INTERNACION:
SELECT diag.id, diag.id_cie, tipo_hc
FROM ((admision_internacion AS admi INNER JOIN hc_internacion AS hci ON admi.id=hci.id_admision) INNER JOIN diagnosticos as diag ON diag.id_hc=hci.id AND diag.tipo_hc='hc_internacion')
WHERE admi.id_paciente=279

ATENCION EN GUARDIA:
SELECT diag.id, diag.id_cie, tipo_hc
FROM ((admision_guardia AS admg INNER JOIN hc_guardia AS hcg ON admg.id=hcg.id_admision) INNER JOIN diagnosticos as diag ON diag.id_hc=hcg.id AND diag.tipo_hc='hc_guardia')
WHERE admi.id_paciente=279

** el tema es que no se como fusionar estas dos consulta en una, en funcion del valor del campo “tipo_hc” de la tabla diagnosticos {`hc_internacion`,'hc_guardia'} **

La cantidad de registros superaría los millones, pues esta pensada para un hospital importante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar