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

Varios join

Estas en el tema de Varios join en el foro de Mysql en Foros del Web. Hola tengo la tabla usuarios que tiene un campo id_ucat este campo es la categoria de usuario Las categorias pueden ser Contactos - Clientes - ...
  #1 (permalink)  
Antiguo 02/12/2011, 10:30
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Exclamación Varios join

Hola tengo la tabla usuarios que tiene un campo id_ucat este campo es la categoria de usuario
Las categorias pueden ser

Contactos - Clientes - Usuarios


Tengo otra tabla (a_usuarios) en donde le asigno clientes a los usuarios, y contactos a los clientes y también contactos directamente a los usuarios.

usuarios
iid_usuario - apellido_empresa - id_ucat

a_usuarios
id_usuario - id_asignado_a

Me estoy volviendo loco, porque quiero obtener, todos los contactos de un usuario.
El tema está en que los contactos pueden se directos y indirectos, osea puede estar el contacto asignado al usuario directamente, pero quiero obtener tambien los contactos de los cliente que tenga asignado el usuario, estos serían indirectos.

esto me devuelve todos los que estan asignados a alguien, no importa que categoria

Código MySQL:
Ver original
  1. au.id_usuario,
  2. u.apellido_empresa,
  3. au.id_asignado_a
  4.  
  5. FROM   usuarios u JOIN a_usuarios au
  6.  ON au.id_usuario = u.id_usuario

Pero desde acá no logro obtener lo que quiero,
Si alguien podría orientarme se lo agradeceré, hace 3 dias que no duermo.

Saludos
__________________
la la la

Última edición por truman_truman; 02/12/2011 a las 11:03 Razón: me equivoqué de foro?
  #2 (permalink)  
Antiguo 02/12/2011, 19:40
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: Varios join

Nadie sabe nada? alguna orientación que me puedan dar?

PD: no quiero ser molesto
__________________
la la la
  #3 (permalink)  
Antiguo 02/12/2011, 20:43
Avatar de 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
Puntos: 2658
Respuesta: Varios join

Es que el hecho de que estés usando dos tablas para lo que deberías usar cuatro, dificulta la cosa.
Me explico: En un modelo desarrollado sobre la base del paradigma E-R, no puedes mezclar entidades que representan cosas distintas, como so Usuarios, Clientes y Contactos. Cada una de ellas debería ser una entidad separada ya que los atributos de cada una suelen ser diferentes, más allá de compartir un conjunto de ellos.
Lo que suele hacerse para evitar problemas es crear una Entidad Persona, de la que dependan las tres en cuestión. A su vez, estas tres tienen entre si relaciones N:N que definirían dos tablas mas, por lo que el esquema debería ser de al menos seis tablas.
Tamaña atomización puede parecerte excesiva, pero el resultado de eso es una escritura mucho más simple de las consultas, un mejor aprovechamiento del espacio de almacenamiento, y la consistencia de no sumar caballos con manzanas.

En cualquier caso, es posible hacer lo que pides con las tablas como las tienes, pero hace que las consultas sean algo complicadas...

Por lo pronto, tienes que definir el razonamiento en forma escalar. Primero crea las consultas que recuperan los bloques a usar, y luego realiza la integración.
Al como:
- Obtener los Usuarios y Clientes:
Código MySQL:
Ver original
  1. SELECT DISTINCT u.*, au.id_usuario id_contacto
  2. FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  3. WHERE u.id_ucat = 'Usuario' AND au.id_ucat = 'Cliente';
- Obtener los Clientes y Contactos:
Código MySQL:
Ver original
  1. SELECT DISTINCT u.*, au.id_usuario id_contacto
  2. FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  3. WHERE u.id_ucat = 'Cliente' AND au.id_ucat = 'Contacto';
- Obtener los Usuarios y Contactos:
Código MySQL:
Ver original
  1. SELECT DISTINCT u.*, au.id_usuario id_contacto
  2. FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  3. WHERE u.id_ucat = 'Usuario' AND au.id_ucat = 'Contacto';
El problema se complica a la hora de integrar estas tres en una sola, algo más elaborada...

Esta es sólo una aproximación, puede que no te de el resultado esperado porque no tengo como verificarla:
Código MySQL:
Ver original
  1. SELECT DISTINCT u.*, au.id_usuario id_contacto
  2. FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  3. WHERE u.id_ucat = 'Usuario' AND au.id_ucat = 'Contacto')
  4. SELECT TC.id_usuario, TC.apellido_empresa, TC.id_contacto
  5.   (SELECT DISTINCT u.*, au.id_usuario id_cliente
  6.   FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  7.   WHERE u.id_ucat = 'Usuario' AND au.id_ucat = 'Cliente') T3
  8.   (SELECT DISTINCT au.id_usuario id_contacto
  9.   FROM usuarios u INNER JOIN a_usuarios au ON u.id_usuario = au.id_usuario
  10.   WHERE u.id_ucat = 'Cliente' AND au.id_ucat = 'Contacto') T4 ON T3.id_cliente = T4.id_contacto) TC;

Para que puedas apreciar la diferencia, esto sería un ejemplo de consulta usando un esquema como el que te describía más arriba:
Código MySQL:
Ver original
  1. SELECT U.id_usuario, U.apellido_empresa, C.id_contacto
  2. FROM Usuarios U
  3.      INNER JOIN usuarios_contactos UC USING(id_usuario)
  4.      INNER JOIN contactos C USING(id_contacto)
  5. SELECT U.id_usuario, U.apellido_empresa, C.id_contacto
  6. FROM Usuarios U
  7.      INNER JOIN usuarios_clientes UC USING(id_usuario)
  8.      INNER JOIN clientes_contactos CC USING(id_cliente)
  9.      INNER JOIN contactos C USING(id_contacto);

¿Se aprecia la simplicidad?

A veces lo que parece darnos cosas fáciles de programar, en realidad nos complica la vida a largo plazo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/12/2011 a las 20:53
  #4 (permalink)  
Antiguo 02/12/2011, 21:20
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: Varios join

Bueno justo cuendo lo resolví, vi tu respuesta, y te agradezco infinitamente el tiempo que tew tomaste para responder a mi consulta.

Pongo aquí el código, hasta ahora me está funcionando perfectamente, espero que se comporte bien en el futuro


Código MySQL:
Ver original
  1. au.id_usuario ,
  2. u.apellido_empresa,
  3. au.id_asignado_a
  4. FROM   usuarios u
  5. JOIN a_usuarios au
  6.   ON u.id_usuario = au.id_usuario and       u.id_ucat =   6
  7.            SELECT
  8.             au.id_usuario ,            
  9.             u.apellido_empresa,
  10.             au.id_asignado_a
  11.             FROM a_usuarios au
  12.             JOIN usuarios u
  13.             ON u.id_usuario = au.id_usuario            
  14.             WHERE   au.id_asignado_a = 20
  15.  
  16.         )xx ON xx.id_usuario =  au.id_asignado_a OR (  au.id_asignado_a = xx.id_asignado_a AND xx.id_usuario = au.id_usuario)
  17. WHERE  u.id_ucat =   6


Esa es la consulta abreviada que postié pero en realidad la consulta completa es la siguiente, y quisiera saber si es prudente hacer tantas consultas en una:



Código MySQL:
Ver original
  1.     p.provincia as provincia,
  2.     r.ruta as ruta,
  3.     c.ciudad as ciudad,
  4.     CONCAT(u.apellido_empresa,' ',u.nombre)     as nombre,
  5.     u.nombre as si_hay_nombre_es_persona,
  6.     u.id_ucat as idcat,
  7.     u.id_usuario as id_u,
  8.     uc.categoria,
  9.     (SELECT GROUP_CONCAT(email)  FROM emails  WHERE id_ue = u.id_usuario) AS todosemails,
  10.     (SELECT GROUP_CONCAT(telefono)  FROM telefonos tel WHERE tel.id_ut = u.id_usuario) AS todostel,
  11.     (
  12.         SELECT
  13.         GROUP_CONCAT((
  14.            
  15.             SELECT CONCAT(u.apellido_empresa,' ',u.nombre)
  16.             FROM usuarios u
  17.             WHERE u.id_usuario = au.id_asignado_a
  18.             )
  19.         )
  20.         FROM a_usuarios au
  21.         WHERE  au.id_usuario =  u.id_usuario
  22.     ) AS asignadoa
  23.  
  24.     FROM   usuarios u
  25.     LEFT OUTER JOIN rutas r ON u.id_ruta = r.id_ruta
  26.     LEFT OUTER JOIN ciudades c  ON u.id_ciu = c.id_ciu
  27.     LEFT OUTER JOIN provincias p  ON u.id_prov = p.id_prov
  28.     LEFT OUTER JOIN u_origen o ON u.id_origen = o.id_origen
  29.     JOIN u_cat uc ON uc.id_ucat = u.id_ucat
  30.      JOIN a_usuarios au
  31.   ON u.id_usuario = au.id_usuario and       u.id_ucat =   6
  32.            SELECT
  33.             au.id_usuario ,            
  34.             au.id_asignado_a
  35.             FROM a_usuarios au
  36.             JOIN usuarios u
  37.             ON u.id_usuario = au.id_usuario            
  38.             WHERE   au.id_asignado_a = 20
  39.  
  40.         )xx ON xx.id_usuario =  au.id_asignado_a OR (  au.id_asignado_a = xx.id_asignado_a AND xx.id_usuario = au.id_usuario)
  41.       WHERE  u.id_ucat = 6  AND CONCAT(u.apellido_empresa,u.nombre) like  '%%'
  42.     ORDER BY apellido_empresa
  43.     LIMIT 0, 200
  44.          
  45.           ;
__________________
la la la

Etiquetas: Ninguno
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 22:12.