Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Unir 2 tablas y varias veces un campo

Estas en el tema de Unir 2 tablas y varias veces un campo en el foro de Mysql en Foros del Web. Tengo las siguientes tablas: empresas_personas ---------------------------- id id_empresa id_persona empresas_telefonos ---------------------------- id id_empresa id_telefono id_persona El campo id_persona de la tabla empresas_telefonos puede ser NULL, ...
  #1 (permalink)  
Antiguo 18/10/2011, 17:39
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Unir 2 tablas y varias veces un campo

Tengo las siguientes tablas:

empresas_personas
----------------------------
id
id_empresa
id_persona


empresas_telefonos
----------------------------
id
id_empresa
id_telefono
id_persona

El campo id_persona de la tabla empresas_telefonos puede ser NULL, si existe un valor indica que el telefono es personal (o directo) y si no existe indica que el telefono es un conmutador

Y necesito formar un directorio de telefonos de la siguiente manera:

id_empresa, id_persona, id_telefono_conmutador, id_telefono_directo

Ejemplo:

Empresa1, Persona1, (telefonoempresa1, telefonoempresa2), (telefonodirecto1,telefonodirecto2)
Empresa1, Persona2, (telefonoempresa1, telefonoempresa2), (telefonodirecto3)
etc..

El problema al que me enfrento es que una empresa puede tener multiples personas y multiples telefonos y estos se van repitiendo para cada persona

Hasta ahora lo resolvi de la siguiente manera:

Código:
SELECT empresas_personas.id, empresas_personas.id_empresa, empresas_personas.id_persona, e1.id_telefono AS tel_empresa, e2.id_telefono AS tel_directo
FROM empresas_personas
LEFT JOIN empresas_telefonos AS e1 ON empresas_personas.id_empresa = e1.id_empresa
AND ISNULL( e1.id_persona )
LEFT JOIN empresas_telefonos AS e2 ON empresas_personas.id_empresa = e2.id_empresa
AND e2.id_persona = empresas_personas.id_persona
LIMIT 0 , 10
Pero este codigo me repite a las personas por cada telefono que encuentra, en vez de concatenar todos los telefonos encontrados en uno solo separados por espacios

Conozco la orden CONCAT_WS, solo que no se como realizar la subconsulta para que me encuentre todos los telefonos y los una a una sola persona

Me pueden ayudar?

Gracias..
  #2 (permalink)  
Antiguo 18/10/2011, 20:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Unir 2 tablas y varias veces un campo

Es un poco complicada la idea para hacerla de una forma tan rústica y con tablas tan mal definidas, pero probemos:
Código MySQL:
Ver original
  1.   EP.id_empresa,
  2.   IFNULL(EP.id_persona, '') id_persona,
  3.   GROUP_CONCAT(DISTINCT IF(EP.id_persona IS NULL, ET.id_telefono, '') SEPARATOR ' ')  tel_empresa,
  4.   GROUP_CONCAT(DISTINCT IF(EP.id_persona IS NULL, '', ET.id_telefono) SEPARATOR ' ') tel_directo
  5.   empresas_personas EP
  6.   empresas_telefonos ET ON EP.id_empresa = EP.id_empresa
  7. GROUP BY   EP.id_empresa, EP.id_persona;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/10/2011, 21:08
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: Unir 2 tablas y varias veces un campo

jajaja.. si .. ya me lo han comentado antes... pero sinceramente no he encontrado una literatura que me ayude en saber como organizar bien las tablas...

Algunas sugerencias?

Apenas ando comenzando a leer el Database Managments Systems de Ramakrishnan, pero tambien son bienvenidos tutoriales por web....
  #4 (permalink)  
Antiguo 21/10/2011, 00:24
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: Unir 2 tablas y varias veces un campo

Sigo completamente echo bolas...

De que manera podria almacenar empresas, personas y telefonos sabiendo que un telefono puede pertenecer a una persona y/o a una empresa, y una persona puede trabajar o no en una empresa??
  #5 (permalink)  
Antiguo 21/10/2011, 01:09
Avatar de azimutisima  
Fecha de Ingreso: mayo-2011
Mensajes: 107
Antigüedad: 12 años, 11 meses
Puntos: 14
Respuesta: Unir 2 tablas y varias veces un campo

Si te he entendido bien yo lo haria así:

Tabla Empresas: id, Nombre, direccion, ...
Tabla Personas: id, Nombre, direccion, idEmp (id de la empresa), si está a null no trabaja en ninguna empresa.

Tabla TelefonosPersonas: id, idPersonas, Telefono, Tipo, donde tipo es (1, personal, 2 Fijo, 3 Movil, 4 Conmutador... )

Tabla TelefonosEmpresa: id, idEmpresas, Telefono, Tipo, donde tipo es (1, personal, 2 Fijo, 3 Movil, 4 Conmutador... )

Tabla TiposTelefono: id, Descripcion

Esta es una tabla auxiliar con las descripciones de los tipos de telefono.

Otra cosa seria que una persona pudiera pertenecer a varias empresas, entonces habria que sacar el idEmp de la tabla personas y
crear una tabla auxiliar que las relacionara.

Espero te sirva.

Etiquetas: concat, multiples+tablas, repetir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:28.