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

[SOLUCIONADO] Combinar 5 tablas ?

Estas en el tema de Combinar 5 tablas ? en el foro de Mysql en Foros del Web. Hola: Estoy muy liado con una consulta, probé varias cosas y no se como hacerla, si alguien me tira la solución se lo agradezco. Tengo ...
  #1 (permalink)  
Antiguo 24/07/2015, 19:41
 
Fecha de Ingreso: junio-2006
Mensajes: 24
Antigüedad: 17 años, 10 meses
Puntos: 0
Combinar 5 tablas ?

Hola: Estoy muy liado con una consulta, probé varias cosas y no se como hacerla, si alguien me tira la solución se lo agradezco.

Tengo 5 tablas:
categorias (cat_id, cat_nombre)
rubros (rubro_id)
rubros_x_categorias (cat_id, rubro_id)
empresas (empresa_id)
rubros_x_empresas (rubro_id, empresa_id)

Lo que busco es listar las categorias qu tienen empresas cargadas.

Hay forma de hacerlo sin vincular las 5 tablas y hacer una consulta muy pesada?

Traté de publicar el tema en el subforo de mysql pero no hay caso, asi qu no me reten ;)

Gracias!
  #2 (permalink)  
Antiguo 24/07/2015, 19:49
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: Combinar 5 tablas ?

Cita:
Lo que busco es listar las categorias qu tienen empresas cargadas.
Probablemente con cuatro tablas alcance para eso, pero no puedes hacerlo sin esas cuatro... (la tabla descriptiva de rubros no se requiere para las categorías).
En todo caso, como está muy normalizada, no tienes otra solución. Pero si está bien construida, no debería ser "pesada", como dices.
¿Cómo son las consultas que intentaste?
__________________
¿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 24/07/2015, 20:22
 
Fecha de Ingreso: junio-2006
Mensajes: 24
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: Combinar 5 tablas ?

Hola: Tenés razón con que la tabla descriptiva de rubros no es necesaria.
Entonces me quedó asi la consulta:

Código MySQL:
Ver original
  1. SELECT dir_categ.dir_cat_id, dir_categ.dir_cat_nombre
  2. dir_categ, dir_rubro_x_cat, dir_rubro_x_empr, dir_empresa
  3. dir_categ.dir_cat_id = dir_rubro_x_cat.dir_cat_id AND
  4. dir_rubro_x_cat.dir_rubro_id = dir_rubro_x_empr.dir_rubro_id AND
  5. dir_rubro_x_empr.dir_empr_id = dir_empresa.dir_empr_id
  6. GROUP BY dir_categ.dir_cat_id
Será lo más optimo o hay otra solución mejor? Gracias!

Última edición por gnzsoloyo; 24/07/2015 a las 21:13
  #4 (permalink)  
Antiguo 24/07/2015, 22:28
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: Combinar 5 tablas ?

MySQL no optimiza el WHERE, por lo que no es buena idea usar JOIN implícitos (la coma), sino explícitos. El FROM si es optimizado y por ello cuando tienes muchos registros, la performance de un INNER JOIN es usualmente superior.
Con el JOIN implícito es posible que haga una lectura de tipo full table scan, lo que es espantoso, y en algunos casos puede generar productos cartesianos (el peor escenario).
En lugar de eso, el INNER JOIN va devolviendo sólo los registros oincidentes, basados en un indice de FK, cuando las foreign key se han definido (es recomendable no usar tablas MyISAM en este tipo de relaciones).
Por otro lado, el GROUP BY es una cláusula asesina de la performance, ya que s eaplica al resultado luego de ser leído. Es preferible para tu caso usar el DISTINCT, que va descartando repeticiones mientras las recupera, en lugar de hacerlo al final.

La idea sería mas o menos así:
Código SQL:
Ver original
  1. SELECT DISTINCT
  2.     DC.dir_cat_id, DC.dir_cat_nombre
  3. FROM
  4.     dir_categ DC
  5.     INNER JOIN dir_rubro_x_cat DRC ON DC.dir_cat_id = DRC.dir_cat_id
  6.     INNER JOIN dir_rubro_x_empr DRE ON DRC.dir_rubro_id = DRE.dir_rubro_id
  7.     INNER JOIN dir_empresa DE ON DRE.dir_empr_id = DE.dir_empr_id ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/07/2015, 08:21
 
Fecha de Ingreso: junio-2006
Mensajes: 24
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: Combinar 5 tablas ?

Jamás hubiera hecho la consulta así. Muy buena, y se nota un montón en los tiempos de ejecución.

Traté de agregarle un filtro más y no se como hacerlo, necesito que además filtre por un campo de la tabla dir_empresa (DE), es el campo dom_id (mediumint(4)). Que tenga en cuenta las empresas que tienen dom_id = '1'.

En este caso si debería agregar un where?

Gracias!
  #6 (permalink)  
Antiguo 25/07/2015, 08:59
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: Combinar 5 tablas ?

Cita:
En este caso si debería agregar un where?
Por supuesto. El FROM es sólo para relacionar tablas, no para poner otras condiciones (aunque sintácticamente lo tolere).
Pon en el WHERE lo que necesites.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/07/2015, 09:18
 
Fecha de Ingreso: junio-2006
Mensajes: 24
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: Combinar 5 tablas ?

Ok. Lo hice así y funciona Ok.

Código MySQL:
Ver original
  1.     DC.dir_cat_id, DC.dir_cat_nombre
  2.     dir_categ DC
  3.     INNER JOIN dir_rubro_x_cat DRC ON DC.dir_cat_id = DRC.dir_cat_id
  4.     INNER JOIN dir_rubro_x_empr DRE ON DRC.dir_rubro_id = DRE.dir_rubro_id
  5.     INNER JOIN dir_empresa DE ON DRE.dir_empr_id = DE.dir_empr_id
  6. DE.dom_id = '3'

GRACIAS!!

Última edición por gnzsoloyo; 25/07/2015 a las 09:39
  #8 (permalink)  
Antiguo 25/07/2015, 09:46
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: Combinar 5 tablas ?

Un último consejo por ahora: Cuando los campos sean numéricos, no pongas el valor a comparar como cadena de texto.
Me refiero específicamente a es '3', que debería escribirse sin los apóstrofos (').
Cuando usas apostrofos contra una columna de tipo INT o cualquier otro numerico, obligas a MySQL a realizar conversiones implícitas que pueden afectar la performance en ciertos casos.
Por otro lado, si lo estás insertando programáticamente, por medio de un lenguaje en el que generes la consulta, al ponerlo así estás escondiendo errores de programación en el manejo de variables.
Para ser claro, supongamos que por algún defecto no detectado en el manejo de los formularios, la variable llegase vacía.
En ese caso al crear la consulta sin apostrofos quedaría así:
Código MySQL:
Ver original
  1.         DC.dir_cat_id, DC.dir_cat_nombre
  2.     FROM
  3.         dir_categ DC
  4.         INNER JOIN dir_rubro_x_cat DRC ON DC.dir_cat_id = DRC.dir_cat_id
  5.         INNER JOIN dir_rubro_x_empr DRE ON DRC.dir_rubro_id = DRE.dir_rubro_id
  6.         INNER JOIN dir_empresa DE ON DRE.dir_empr_id = DE.dir_empr_id
  7.     WHERE  DE.dom_id =
En ese caso, como el dato no llega, se rompe la sintaxis y la consulta dispara un error.

Pero si lo manejas con apostrofes, una variable vacía dejaría la consulta así:


Código MySQL:
Ver original
  1.         DC.dir_cat_id, DC.dir_cat_nombre
  2.     FROM
  3.         dir_categ DC
  4.         INNER JOIN dir_rubro_x_cat DRC ON DC.dir_cat_id = DRC.dir_cat_id
  5.         INNER JOIN dir_rubro_x_empr DRE ON DRC.dir_rubro_id = DRE.dir_rubro_id
  6.         INNER JOIN dir_empresa DE ON DRE.dir_empr_id = DE.dir_empr_id
  7.     WHERE  DE.dom_id = ''
Eso no te disparará el error de sintaxis, pero no devolvería datos, con lo que tu podrías creer que hay un error en la consulta, o en la base, o bien en la conexión, cuando en realidad el problema está en que el dato simplemente no llega desde el formulario.

¿Se entiende?

No pongas valores numéricos entre apóstrofos a menos que el campo con que los comparas sea VARCHAR.

Y no le tengas miedo a los errores. Los errores son la única forma de detectar que los programas están mal. El secreto es manejar las excepciones y capturar los errores para resolverlos. No esconderlos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 25/07/2015, 14:55
 
Fecha de Ingreso: junio-2006
Mensajes: 24
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: Combinar 5 tablas ?

Está clarísimo gnzsoloyo, te agradezco un montón! Saludos

Etiquetas: combinar, sql, tabla, tablas
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 06:13.