Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/07/2015, 11:27
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: relacionar varios campos de una tabla con una misma tabla maestra

Hola Mager:

Desde mi punto de vista tienes un muy mal modelo de BD's... cuando un atributo es opcional (como es tu caso, pues depende de la respuesta Si/No) debes crear una tabla aparte, ¿Qué pasa cuando se contesta NO a alguna de las preguntas? supongo que deberás dejar los campos relacionados (edad y unidad como nulos cierto)... esto es un terrible error de diseño. Si tienes oportunidad de cambiar tu modelo, hazlo y evita dolores de cabeza, (y que te cueste mucho trabajo no es una razón para no hacerlo).

Ahora bien, si en realidad no puedes modificar tu modelo de datos, lo que quieres hacer se puede hacer utilizando JOIN's, duplicando la tabla catálogo por cada campo que quieras relacionar de manera independiente, utilizando alias distintos... va un ejemplo, supongamos que tienes estos datos:

Código MySQL:
Ver original
  1. mysql>
  2.  
  3. mysql> SELECT * FROM tabla_unidades;
  4. +--------+-------------+
  5. | unidad | descripcion |
  6. +--------+-------------+
  7. |      1 | Años        |
  8. |      2 | Meses       |
  9. |      3 | Dias        |
  10. +--------+-------------+
  11. 3 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tabla_uno;
  14. +------+-------------------+----------+---------------+----------------------+---------------+--------------------+---------------------------+
  15. | id   | paciente          | Vacunado | edad_vacunado | unidad_edad_vacunado | desparasitado | edad_desparasitado | unidad_edad_desparasitado |
  16. +------+-------------------+----------+---------------+----------------------+---------------+--------------------+---------------------------+
  17. |    1 | Pepito Perez      | SI       |             4 |                    1 | SI            |                  2 |                         2 |
  18. |    2 | Juanito Garcia    | NO       |          NULL |                 NULL | SI            |                  3 |                         3 |
  19. |    3 | Pedrito Fernandez | SI       |             3 |                    1 | NO            |               NULL |                      NULL |
  20. +------+-------------------+----------+---------------+----------------------+---------------+--------------------+---------------------------+
  21. 3 rows in set (0.00 sec)

Para cada campo que tenga relación con el catálogo de unidades debes hacer un LEFT JOIN, así:

Código MySQL:
Ver original
  1. mysql> SELECT paciente, vacunado, edad_vacunado, U1.descripcion, desparasitado, edad_desparasitado, U2.descripcion
  2.     -> FROM tabla_uno
  3.     -> LEFT JOIN tabla_unidades U1 ON tabla_uno.unidad_edad_vacunado = U1.unidad
  4.     -> LEFT JOIN tabla_unidades U2 ON tabla_uno.unidad_edad_desparasitado = U2.unidad;
  5. +-------------------+----------+---------------+-------------+---------------+--------------------+-------------+
  6. | paciente          | vacunado | edad_vacunado | descripcion | desparasitado | edad_desparasitado | descripcion |
  7. +-------------------+----------+---------------+-------------+---------------+--------------------+-------------+
  8. | Pepito Perez      | SI       |             4 | Años        | SI            |                  2 | Meses       |
  9. | Juanito Garcia    | NO       |          NULL | NULL        | SI            |                  3 | Dias        |
  10. | Pedrito Fernandez | SI       |             3 | Años        | NO            |               NULL | NULL        |
  11. +-------------------+----------+---------------+-------------+---------------+--------------------+-------------+
  12. 3 rows in set (0.00 sec)

De esta manera obtienes la descripción asociada al código de la unidad (observa que ya aprarece la palabra AÑOS, MESES, DIAS según corresponda).

Esta consulta sólo es válida si almacenas NULL cuando la respuesta es NO, si almacenas algún otro valor, el resultado puede no ser el deseado.

Haz la prueba y nos comentas.

Saludos
Leo