Ver Mensaje Individual
  #4 (permalink)  
Antiguo 24/07/2012, 19:41
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: 17 años, 3 meses
Puntos: 2658
Respuesta: duda con consulta

Es posible que haya un error de comprensión sobre lo que devuelve una consulta cuando realizas una relación entre tres tablas donde una de ellas es la representación de una relación N:N entre dos entidades.
Cuando generas una consulta tal que relacione esas tablas, los valores de la tabla izquierda (la tabla base de la consulta9, siempre se repetirán una vez por cada coincidencia entre esa tabla y la segunda. Eso es inevitable, porque lo que no se repite es el conjunto completo de valores.
En otras palabras:
Si tenemos las tablas que indicas:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS clinica, prestacion, isapres;
  2. Query OK, 0 rows affected (0.05 sec)
  3.  
  4. mysql> CREATE TABLE IF NOT EXISTS clinica
  5.     ->     (ID_CLINICA INT UNSIGNED PRIMARY KEY,
  6.     ->     VAL_CLINICA VARCHAR(50));
  7. Query OK, 0 rows affected (0.06 sec)
  8.  
  9. mysql> CREATE TABLE IF NOT EXISTS prestacion
  10.     ->     (ID_ISAPRES INT UNSIGNED,
  11.     ->     ID_CLINICA INT UNSIGNED,
  12.     ->     PRIMARY KEY(ID_ISAPRES, ID_CLINICA));
  13. Query OK, 0 rows affected (0.01 sec)
  14.  
  15. mysql> CREATE TABLE IF NOT EXISTS isapres
  16.     ->     (ID_ISAPRES INT UNSIGNED PRIMARY KEY,
  17.     ->     VAL_ISAPRES VARCHAR(50));
  18. Query OK, 0 rows affected (0.05 sec)
  19.  
  20. mysql> INSERT INTO isapres
  21.     -> VALUES
  22.     ->     (1, 'BANMEDICA'),
  23.     ->     (2, 'SINSALUD'),
  24.     ->     (3, 'CORMENA'),
  25.     ->     (4, 'CORMENAL');
  26. Query OK, 4 rows affected (0.00 sec)
  27. Records: 4  Duplicates: 0  Warnings: 0
  28.  
  29. mysql> INSERT INTO clinica
  30.     -> VALUES
  31.     ->     (1, 'LAS LILAS'),
  32.     ->     (2, 'LAS FLORES');
  33. Query OK, 2 rows affected (0.00 sec)
  34. Records: 2  Duplicates: 0  Warnings: 0
  35.  
  36. mysql> INSERT INTO prestacion
  37.     -> VALUES
  38.     ->     (2, 1),
  39.     ->     (3, 1);
  40. Query OK, 2 rows affected (0.00 sec)
  41. Records: 2  Duplicates: 0  Warnings: 0

Podemos hacer la consulta con LEFT JOIN o INNER JOIN.
En el primer caso tendremos:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     I.ID_ISAPRES,
  3.     ->     I.VAL_ISAPRES,
  4.     ->     IFNULL(C.ID_CLINICA, '') ID_CLINICA,
  5.     ->     IFNULL(C.VAL_CLINICA, '') VAL_CLINICA
  6.     -> FROM isapres I
  7.     ->     INNER JOIN
  8.     ->     prestacion P ON I.ID_ISAPRES = P.ID_ISAPRES
  9.     ->     INNER JOIN clinica C ON P.ID_CLINICA = C.ID_CLINICA;
  10. +------------+-------------+------------+-------------+
  11. | ID_ISAPRES | VAL_ISAPRES | ID_CLINICA | VAL_CLINICA |
  12. +------------+-------------+------------+-------------+
  13. |          2 | SINSALUD    | 1          | LAS LILAS   |
  14. |          3 | CORMENA     | 1          | LAS LILAS   |
  15. +------------+-------------+------------+-------------+
  16. 2 rows in set (0.00 sec)
En el segundo caso será:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     I.ID_ISAPRES,
  3.     ->     I.VAL_ISAPRES,
  4.     ->     IFNULL(C.ID_CLINICA, '') ID_CLINICA,
  5.     ->     IFNULL(C.VAL_CLINICA, '') VAL_CLINICA
  6.     -> FROM isapres I
  7.     ->     LEFT JOIN
  8.     ->     prestacion P ON I.ID_ISAPRES = P.ID_ISAPRES
  9.     ->     LEFT JOIN clinica C ON P.ID_CLINICA = C.ID_CLINICA;
  10. +------------+-------------+------------+-------------+
  11. | ID_ISAPRES | VAL_ISAPRES | ID_CLINICA | VAL_CLINICA |
  12. +------------+-------------+------------+-------------+
  13. |          1 | BANMEDICA   |            |             |
  14. |          2 | SINSALUD    | 1          | LAS LILAS   |
  15. |          3 | CORMENA     | 1          | LAS LILAS   |
  16. |          4 | CORMENAL    |            |             |
  17. +------------+-------------+------------+-------------+
  18. 4 rows in set (0.05 sec)

Sobre la base de esto, aclárame qué es lo que realmente quieres representar, y cuáles "repeticiones" son las que mencionas, porque no se termina de entender.

Nota: En tu ejemplo, tienes repetidos los datos de una de las tablas, lo que se considera una inconsistencia gravísima.

Nota 2: La próxima vez usa un programa de diseño asistido para hacer el diagrama. Algo como el MySQL Workbench o el Navicat. Será mucho claro para ver las relaciones y las entidades, y además tendrás una herramienta apropiada para trabajar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)