SQL - Realiza correctamente la union de tablas

 
Vista:
sin imagen de perfil
Val: 3
Ha disminuido su posición en 3 puestos en SQL (en relación al último mes)
Gráfica de SQL

Realiza correctamente la union de tablas

Publicado por C.J (2 intervenciones) el 31/08/2017 20:38:57
Buen día:
Tengo una tabla llamda contactos, cada contacto tiene mas de un telefono, por lo tanto saque esa informacion en otro tabla llamda telefono_contacto, pero a su vez cada contacto puede tener más de un correo, de igual forma esta en otra tabla.
estas tablas esta relacionadas con el ID del contacto.
Mi pregunta es: ¿como le puede hacer para unir esta información?.
Lo estaba intentando con Joins pero por ejemplo al sacar los telefono, me duplica la información del contacto.
alguna sugerencia o esta mal estrucutra la base de datos.
Muchas grcaias
Saludos!
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Realiza correctamente la union de tablas

Publicado por leonardo_josue (1173 intervenciones) el 31/08/2017 21:54:19
Hola C.J.

El modelo que tienes es correcto, sin embargo el problema es en cómo estás presentando la información...

Vamos aclarando una parte importante: la consulta no "DUPLICA" la información como mencionas, simplemente lo que hace es unir de acuerdo a los criterios que tu tengas y mostrar la información que corresponde...

El problema radica en la cardinalidad de tus tablas, al tener una relación 1 a muchos y querer unir esto a otra tabla con una relación también de 1 a muchos, entonces esto se convierte en una relación "muchos a muchos" por eso puedes tener la falsa idea de que te está duplicando información o te está realizando algún producto cartesiano.

aquí tienes varias opciones, la más sencillas es "cambiar" tu cardinalidad a 1 a 1, es decir, que un contacto tenga un sólo teléfono y si fuera el caso de que tiene más de un teléfono, entonces mostrarlo en un solo campo...

MUCHO OJO, dije mostrarlo, no guardarlo en un solo campo... ya que tener campos multivaluados es un terrible error de diseño.

Creo que con un ejemplo sería más simple... para este caso, voy a utilizar la función GROUP_CONCAT... Supongamos que tienes tus tablas así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> select * from contactos;
+-------------+--------+
| id_contacto | nombre |
+-------------+--------+
|           1 | uno    |
|           2 | dos    |
|           3 | tres   |
+-------------+--------+
3 rows in set (0.00 sec)
 
mysql> select * from contactos_telefonos;
+----------------------+-------------+-------------+
| id_contacto_telefono | id_contacto | telefono    |
+----------------------+-------------+-------------+
|                    1 |           1 | 111-111-111 |
|                    2 |           2 | 222-222-222 |
|                    3 |           2 | 222-222-223 |
|                    4 |           2 | 222-222-224 |
|                    5 |           3 | 333-333-333 |
|                    6 |           3 | 333-333-334 |
+----------------------+-------------+-------------+
6 rows in set (0.00 sec)

Entonces, si haces un JOIN "normal" obtienes esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT
    ->   c.nombre,
    ->   t.telefono
    -> FROM contactos c
    -> INNER JOIN contactos_telefonos t
    -> ON t.id_contacto = c.id_contacto;
+--------+-------------+
| nombre | telefono    |
+--------+-------------+
| uno    | 111-111-111 |
| dos    | 222-222-222 |
| dos    | 222-222-223 |
| dos    | 222-222-224 |
| tres   | 333-333-333 |
| tres   | 333-333-334 |
+--------+-------------+
6 rows in set (0.00 sec)

Aquí podrías suponer que te esta "repitiendo" el nombre del contacto, pero no es así... si quieres mostrar sólo una vez cada nombre, entonces utilizas la función GROUP_CONCAT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT
    ->   c.nombre,
    ->   GROUP_CONCAT(t.telefono) telefonos
    -> FROM contactos c
    -> INNER JOIN contactos_telefonos t
    -> ON t.id_contacto = c.id_contacto
    -> GROUP BY c.nombre;
+--------+-------------------------------------+
| nombre | telefonos                           |
+--------+-------------------------------------+
| uno    | 111-111-111                         |
| dos    | 222-222-223,222-222-222,222-222-224 |
| tres   | 333-333-333,333-333-334             |
+--------+-------------------------------------+
3 rows in set (0.00 sec)

Si un contacto tiene más de un teléfono, entonces lo concatena en una misma cadena separada por comas... pero tu información sigue estando en tablas separadas.

Checa si esto te puede servir.

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
Val: 3
Ha disminuido su posición en 3 puestos en SQL (en relación al último mes)
Gráfica de SQL

Realiza correctamente la union de tablas

Publicado por C.J (2 intervenciones) el 31/08/2017 23:21:29
Gracias por la respuesta, lo intentare aplicar

Muchas gracias
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