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

Mega Consulta - Serían 252 conslutas - como optimizarlo

Estas en el tema de Mega Consulta - Serían 252 conslutas - como optimizarlo en el foro de Mysql en Foros del Web. Hola a todos. Tengo que hacer una "macro consulta" y no se muy bien cómo plantearla. Mirar esta imagen y entenderéis lo que necesito En ...
  #1 (permalink)  
Antiguo 26/04/2014, 04:18
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola a todos.

Tengo que hacer una "macro consulta" y no se muy bien cómo plantearla.

Mirar esta imagen y entenderéis lo que necesito



En los cuadros azules tienen que ir cantidades.
¿Cantidades de que?
De productos.

Tengo que saber cuantos productos están hechos de ACERO en la categoría ARTE
Y cuantos productos están hechos de ACERO en la categoría DECORACIÓN

Y cuantos de CARTÓN en ARTE

Y ambas variantes (material y aplicación) son dinámicas y están en tablas.

- Tabla de productos

- Tabla de Aplicaciones
- Tabla de relación de producto y aplicaciones

- Tabla de Materiales
- Tabla de relación de productos y materiales


A mi solo se me ocurre:
- Recorrer las aplicaciones (arte, decoración, etc)
---- Y por cada aplicación lanzar 1 SQL para cada material.

Hablamos de 12 aplicaciones (dinámico, van creando nuevos ellos desde CMS)
Y hablamos de 21 materiales (dinámico, van creando nuevos ellos desde CMS).

Total: 252 consultas contra la base de datos cada vez que se entre aquí....

Me parece una saturación y burrada (y las conexiones a base de datos se verán saturadas y taponadas si varias personas entran a consultar esta tabla).

Por eso os consulto, por si alguien sabe cómo se haría esto de la forma más óptima.


Gracias y un saludo.



Javier

Última edición por el_javi; 26/04/2014 a las 04:25
  #2 (permalink)  
Antiguo 27/04/2014, 12:16
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

No me puedo considerar en absoluto un profesional de MYSQL, pero si me apuras, solo veo 1 consulta.

Código SQL:
Ver original
  1. SELECT *
  2.  
  3. FROM acero, alum.anodizado, ...
  4.  
  5. LEFT JOIN productos...

¿O no es así?
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 27/04/2014, 14:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi,
Primero tienes que unir la tabla aplicaciones con materiales haciendo producto cartesiano para obtener todas las posibilidades. Luego el resultado en un alias unirlo mediante LEFT JOIN con las tablas productos aplicaciones y productos materiales, tablas que a su vez se unirán medainte INNER JOIN con aplicaciones y materiales respectivamente. Todo ello lo agruparás por aplicaciones y materiales, y usarás COUNT(), es decir, un agrupado con cuenta, y lo que obtendrás no será esa tabla que muestras, sino una lista con los valores ARTE, ACERO 50; ARTE, ALUM.ANODIZADO, NULL, etc;
Luego, mediante programación y con los datos obtenidos de esa única consulta con subconsulta obtendrás, creo, lo que quieres.
Pero antes necesitaremos los nombres de los campos de esas tablas para poder ofrecerte una propuesta de consulta.
Tal vez a alguien se le ocurra alguna otra solución...
  #4 (permalink)  
Antiguo 27/04/2014, 15:27
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola chicos.

Lo primero gracias por contestar... me es muy necesario poder encontrar la manera de hacer esto.

jurena, "medio" entiendo lo que comentas, pero no lo veo del todo claro.

Paso a poner los campos de las tablas para que podáis haceros una idea y podáis darme una SQL aproximada.
Os doy un enlace a descargar la SQL de las 5 tablas, con creación de tablas y datos de inserción, por si alguien quiere hacer pruebas reales en la ayuda.


Tabla de Productos


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `t_products` (
  2.   `PRODUCT_ID` bigint(20) unsigned NOT NULL auto_increment,
  3.   `PRODUCT_title_spanish` varchar(255) default NULL,
  4.   `PRODUCT_tag_search_spanish` varchar(255) default NULL,
  5.   `PRODUCT_description_spanish` mediumtext,
  6.   `PRODUCT_description_technical_spanish` mediumtext,
  7.   `PRODUCT_client` varchar(255) default NULL,
  8.   `PRODUCT_author` varchar(255) default NULL,
  9.   `PRODUCT_in_home_slider` tinyint(1) unsigned NOT NULL default '0',
  10.   `PRODUCT_date` datetime default NULL,
  11.   `PRODUCT_published` tinyint(1) unsigned NOT NULL default '1',
  12.   `PRODUCT_options_erased` tinyint(1) unsigned NOT NULL default '0',
  13.   PRIMARY KEY  (`PRODUCT_ID`)
  14. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Tabla de Productos' AUTO_INCREMENT=86 ;
Tabla de Aplicaciones


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `t_applications` (
  2.   `APPLICATION_ID` bigint(20) unsigned NOT NULL auto_increment,
  3.   `APPLICATION_name_spanish` varchar(255) default NULL,
  4.   `APPLICATION_tag_search_spanish` varchar(255) default NULL,
  5.   `APPLICATION_description_spanish` mediumtext,
  6.   `APPLICATION_options_erased` tinyint(1) unsigned NOT NULL default '0',
  7.   PRIMARY KEY  (`APPLICATION_ID`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Tabla de Aplicaciones' AUTO_INCREMENT=25 ;
Tabla de relación entre Productos y Aplicaciones

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `t_products_applications` (
  2.   `PRODUCTAPPLICATION_ID` bigint(20) NOT NULL auto_increment,
  3.   `PRODUCTAPPLICATION_options_modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  4.   `PRODUCTAPPLICATION_options_erased` tinyint(1) default '0',
  5.   `PRODUCT_ID` bigint(20) default NULL,
  6.   `APPLICATION_ID` bigint(20) default NULL,
  7.   PRIMARY KEY  (`PRODUCTAPPLICATION_ID`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Tabla de relacion entre Productos y Aplicaciones' AUTO_INCREMENT=542 ;[/CODE]Tabla de Materiales


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `t_materials` (
  2.   `MATERIAL_ID` bigint(20) unsigned NOT NULL auto_increment,
  3.   `MATERIAL_name_spanish` varchar(255) default NULL,
  4.   `MATERIAL_tag_search_spanish` varchar(255) default NULL,
  5.   `MATERIAL_description_spanish` mediumtext,
  6.   `MATERIAL_processes` set('cut','mark','record') NOT NULL,
  7.   `MATERIAL_options_erased` tinyint(1) unsigned NOT NULL default '0',
  8.   PRIMARY KEY  (`MATERIAL_ID`)
  9. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Tabla de Aplicaciones' AUTO_INCREMENT=27 ;
Tabla de relación entre Productos y Materiales


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `t_products_materials` (
  2.   `PRODUCTMATERIAL_ID` bigint(20) NOT NULL auto_increment,
  3.   `PRODUCTMATERIAL_options_modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  4.   `PRODUCTMATERIAL_options_erased` tinyint(1) default '0',
  5.   `PRODUCT_ID` bigint(20) default NULL,
  6.   `MATERIAL_ID` bigint(20) default NULL,
  7.   PRIMARY KEY  (`PRODUCTMATERIAL_ID`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Tabla de relacion entre Productos y Materiales' AUTO_INCREMENT=316 ;

Aquí el archivo SQL con la creación de tablas e inserción de datos.



Gracias y espero vuestra ayuda.


Javier

Última edición por gnzsoloyo; 27/04/2014 a las 16:32 Razón: Reetiquetar con Highlight correcto.
  #5 (permalink)  
Antiguo 27/04/2014, 17:01
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi

a ver si entiendo tu BD. un material conforma un producto y este producto tiene una aplicación ¿cierto?

luego para establecer la relación entre material y producto y producto y aplicación has creado dos tablas más ¿cierto?

explícame una cosa

¿esas dos tablas de más se debe a que haces una relación n:n? es decir ¿varios materiales pueden conformar a varios productos a la vez?

es que he decidido por comenzar a repasar el diseño de tu BD antes de embarcarme en lo que sería la consulta, a ver si el diseño está bien hecho.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 28/04/2014, 01:19
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola guardarmicorreo.

No, la lógica es:

1 Producto tiene de 1 a N materiales

Y un Producto tiene de 1 a N aplicaciones

Por eso existen como entidades: Productos, Materiales y Aplicaciones.
Y por otro lado, la relación N:M entre producto y Aplicación
Y la relación N:M entre producto y Material


Saludos.
  #7 (permalink)  
Antiguo 28/04/2014, 03:07
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Prueba lo siguiente y dime si es lo que deseas, comprueba que las cantidades devueltas como "total" realmente corresponden al número de productos totales realizados con los materiales.

Código SQL:
Ver original
  1. SELECT
  2.     P.PRODUCT_ID,
  3.     P.PRODUCT_title_spanish,
  4.     M.MATERIAL_ID,
  5.     M.MATERIAL_name_spanish,
  6.     COUNT(P.PRODUCT_ID)
  7. FROM
  8.     t_products_materials PM
  9. LEFT JOIN
  10.     t_products P
  11. ON
  12.     P.PRODUCT_ID=PM.PRODUCT_ID
  13. LEFT JOIN
  14.     t_materials M
  15. ON
  16.     M.MATERIAL_ID=PM.MATERIAL_ID
  17. GROUP BY
  18.     P.PRODUCT_ID

Y di si te funciona
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 28/04/2014, 03:18
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola guardarmicorreo.

No, el resultado no es correcto.

Me saca:

PRODUCT_ID
PRODUCT_title_spanish
MATERIAL_ID
MATERIAL_title_spanish
COUNT( P.PRODUCT_ID)


Realmente me tendría que sacar:
APPLICATION_ID
APPLICATION_name_spanish
MATERIAL_ID
MATERIAL_name_spanish
TOTAL_PRODUCTS


Saludos.
  #9 (permalink)  
Antiguo 28/04/2014, 03:22
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

entonces solo tienes que modificar la consulta.

me parece que la idea está ahí :)
__________________
Ayúdame a hacerlo por mi mismo.
  #10 (permalink)  
Antiguo 28/04/2014, 03:59
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Bueno, pues tras darle muchas vueltas, y en base a lo iniciado por guardarmicorreo ese es el resultado de la SQL que me saca todo, ordenado y agrupado:

Código SQL:
Ver original
  1. SELECT A.APPLICATION_ID, A.APPLICATION_name_spanish, M.MATERIAL_ID, M.MATERIAL_name_spanish, COUNT(P.PRODUCT_ID)
  2. FROM t_products P
  3. LEFT JOIN t_products_materials PM ON P.PRODUCT_ID=PM.PRODUCT_ID
  4. LEFT JOIN t_materials M ON PM.MATERIAL_ID=M.MATERIAL_ID
  5. LEFT JOIN t_products_applications PA ON P.PRODUCT_ID=PA.PRODUCT_ID
  6. LEFT JOIN t_applications A ON PA.APPLICATION_ID=A.APPLICATION_ID
  7. GROUP BY A.APPLICATION_ID, M.MATERIAL_ID
  8. ORDER BY A.APPLICATION_ID ASC, M.MATERIAL_ID ASC


He hecho revisiones manuales de los cruces y las cantidades mostradas son 100% correctas!!!!


Gracias a todos por la participación y ayuda.


Saludos.
  #11 (permalink)  
Antiguo 28/04/2014, 04:14
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

enhorabuena! :)
__________________
Ayúdame a hacerlo por mi mismo.
  #12 (permalink)  
Antiguo 28/04/2014, 05:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Yo también me alegro, aunque yo cambiaría COUNT(P.PRODUCT_ID) por IFNULL(COUNT(P.PRODUCT_ID),0) total
o por COALESCE(COUNT(P.PRODUCT_ID),0) total
para obtener 0 en lugar de NULL

De todas formas, tengo alguna duda sobre si obtendrás con esas consultas todas las parejas para todos los productos. Me explicaré:
creo que si de algún material no tienes producto aplicación para ese material, no saldrá ese material, pues el left join parte desde la tabla productos, y los materiales de esos productos, pero no todos los materiales y todas las aplicaciones para todos los productos, para lo que creo que habría que usar un producto cartesiano antes entre las dos tablas. No obstante, si tienes todas las variantes aplicación productos y material productos, no verás el problema. Comprueba que con esa consulta te salen todos los pares posibles, aunque sea con NULL o 0.

Última edición por jurena; 28/04/2014 a las 05:35
  #13 (permalink)  
Antiguo 28/04/2014, 06:15
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola Jurena.

Tienes más razón que un santo...

Aquellas aplicaciones cruzadas con materiales que NO tienen productos no me aparecen en el listado.


No se a lo que te refieres al decir " habría que usar un producto cartesiano antes entre las dos tablas"

No se cómo se solucionaría esto... ¿alguna idea?
  #14 (permalink)  
Antiguo 28/04/2014, 12:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi,
ahora no puedo ayudarte con toda la consulta: tal vez algo más tarde. Pero mira esto, esto es a lo que me refiero como producto cartesiano de las tres tablas, aplicaciones, material y productos. Esa consulta (pruébala sola y verás el resultado) la convierto mediante alias en una tabla y luego relaciono con ella las otras tablas.
Código MySQL:
Ver original
  1. SELECT a.APPLICATION_name_spanish, a.APPLICATION_ID, m.MATERIAL_name_spanish, m.MATERIAL_ID, p.PRODUCT_title_spanish, p.PRODUCT_ID
  2. FROM  `t_applications` a, t_materials m, t_products p


Esta otra consulta creo que te saca los datos de un producto en un material y aplicación determinado. Dime si los datos que te saca son correctos. Lo que importa ahora son los números, los identificadores. Luego mostraremos los nombres, por eso no te preocupes
Código MySQL:
Ver original
  1. SELECT p.PRODUCT_ID, IFNULL( COUNT( * ) , 0 ) total, pa.APPLICATION_ID, pm.MATERIAL_ID
  2. FROM `t_products` p
  3. LEFT JOIN t_products_applications pa ON p.PRODUCT_ID = pa.PRODUCT_ID
  4. LEFT JOIN t_products_materials pm ON p.PRODUCT_ID = pm.PRODUCT_ID
  5. GROUP BY pa.APPLICATION_ID, pm.MATERIAL_ID

Última edición por jurena; 28/04/2014 a las 13:24
  #15 (permalink)  
Antiguo 29/04/2014, 01:29
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola jurena.

Te comento:

Cita:
Código MySQL:
Ver original
  1. SELECT p.PRODUCT_ID, IFNULL( COUNT( * ) , 0 ) total, pa.APPLICATION_ID, pm.MATERIAL_ID
  2. FROM `t_products` p
  3. LEFT JOIN t_products_applications pa ON p.PRODUCT_ID = pa.PRODUCT_ID
  4. LEFT JOIN t_products_materials pm ON p.PRODUCT_ID = pm.PRODUCT_ID
  5. GROUP BY pa.APPLICATION_ID, pm.MATERIAL_ID
Esta consulta me saca el listado de los 127 productos que hay con su aplicación y con su material (ID's)

Lo que no entiendo es el campo TOTAL a qué hace referencia...

Yo obtengo un listado como este:

-----PRODUCT_ID---------total---------------APPLICATION_ID---------------MATERIAL_ID----
---------1------------------6--------------------12----------------------------5--------
---------18-----------------1--------------------12----------------------------8--------
---------1------------------5--------------------12----------------------------11------
---------80-----------------1--------------------12----------------------------14------
---------18-----------------1--------------------12----------------------------15------
---------80-----------------1--------------------12----------------------------17------
---------27-----------------1--------------------12----------------------------22------
---------28-----------------5--------------------12----------------------------23------
---------75-----------------1--------------------12----------------------------26------
---------18-----------------7--------------------13----------------------------5--------
---------47-----------------1--------------------13----------------------------6--------
---------32-----------------1--------------------13----------------------------7--------
---------18-----------------7--------------------13----------------------------8--------
---------31-----------------2--------------------13----------------------------9--------
---------24-----------------3--------------------13----------------------------10------
---------19-----------------5--------------------13----------------------------11------
---------49-----------------1--------------------13----------------------------12------
---------64-----------------1--------------------13----------------------------13------
---------2------------------8--------------------13----------------------------15------
---------39-----------------4--------------------13----------------------------17------
---------64-----------------1--------------------13----------------------------21------
---------27-----------------2--------------------13----------------------------22------
---------54-----------------1--------------------13----------------------------23------
---------83-----------------1--------------------13----------------------------25------
---------75-----------------1--------------------13----------------------------26------
---------3------------------2--------------------14----------------------------8-------
---------4------------------2--------------------14----------------------------9-------
---------19-----------------2--------------------14----------------------------11------
---------29-----------------2--------------------14----------------------------15------
---------13-----------------1--------------------14----------------------------19------

etc (hay más registros).

En este resultado NO aparecen todas las Aplicaciones ni todos los materiales... Seguimos con el mismo problema de que las que NO tengan productos relacionados NO a aparecen...


A ver si podemos llegar a la consulta final :)


Gracias de nuevo y un saludo


Javier
  #16 (permalink)  
Antiguo 29/04/2014, 03:00
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi, esto

Código SQL:
Ver original
  1. IFNULL( COUNT( * ) , 0 ) total

viene a decir lo siguiente:

si el resultado de contar todos los campos es null entonces devuélveme cero y todo ese conjunto se llamará total. en el array devuelto tendrás los campos de la tabla y otro llamado total.
__________________
Ayúdame a hacerlo por mi mismo.
  #17 (permalink)  
Antiguo 29/04/2014, 03:05
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Cita:
Iniciado por guardarmicorreo Ver Mensaje
el_javi, esto

Código SQL:
Ver original
  1. IFNULL( COUNT( * ) , 0 ) total

viene a decir lo siguiente:

si el resultado de contar todos los campos es null entonces devuélveme cero y todo ese conjunto se llamará total. en el array devuelto tendrás los campos de la tabla y otro llamado total.
Entonces, el PRODUCT_ID sobra en la consulta ¿no?

-----PRODUCT_ID---------total---------------APPLICATION_ID---------------MATERIAL_ID----
---------1------------------6--------------------12----------------------------5--------

Es irreal que el producto 1 (PRODUCT_ID = 1) está 6 veces en la combinación Aplicación 12 material 5

(quizás fue eso, que PRODUCT_ID sobra y me liaba).


De igual modo, NO aparecen todos los materiales ni todas las aplicaciones...
  #18 (permalink)  
Antiguo 29/04/2014, 03:24
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

pero ¿tu consulta no fue esta?

Cita:
Tengo que saber cuantos productos están hechos de ACERO en la categoría ARTE
Y cuantos productos están hechos de ACERO en la categoría DECORACIÓN
de ahí el count llamado total.

EDITO

no me parece que sea irreal que un producto compuesto por el material de id 5 tenga 6 aplicaciones
__________________
Ayúdame a hacerlo por mi mismo.
  #19 (permalink)  
Antiguo 29/04/2014, 03:40
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Cita:
Iniciado por guardarmicorreo Ver Mensaje
pero ¿tu consulta no fue esta?



de ahí el count llamado total.

EDITO

no me parece que sea irreal que un producto compuesto por el material de id 5 tenga 6 aplicaciones
Si, mi consulta fue:

Necesito saber cuantos productos están hechos de:

MATERIAL A + APLICACIÓN A
MATERIAL A + APLICACIÓN B
MATERIAL A + APLICACIÓN C
MATERIAL A + APLICACIÓN D
MATERIAL A + APLICACIÓN E
MATERIAL A + APLICACIÓN F



MATERIAL B + APLICACIÓN A
MATERIAL B + APLICACIÓN B
MATERIAL B + APLICACIÓN C
MATERIAL B + APLICACIÓN D
MATERIAL B + APLICACIÓN E
MATERIAL B + APLICACIÓN F


MATERIAL C + APLICACIÓN A
MATERIAL C + APLICACIÓN B
MATERIAL C + APLICACIÓN C
MATERIAL C + APLICACIÓN D
MATERIAL C + APLICACIÓN E
MATERIAL C + APLICACIÓN F

MATERIAL D + APLICACIÓN A
MATERIAL D + APLICACIÓN B
MATERIAL D + APLICACIÓN C
MATERIAL D + APLICACIÓN D
MATERIAL D + APLICACIÓN E
MATERIAL D + APLICACIÓN F



Y revisando los datos que nos devuelve la última consulta propuesta:

Cita:
-----PRODUCT_ID---------total---------------APPLICATION_ID---------------MATERIAL_ID----
---------1------------------6--------------------12----------------------------5--------
Si hacemos una lectura exacta de lo que significa este resultado:
El producto 1 tiene un total de 6 en la relación Aplicación = 12 y Material = 5.


Esto es IRREAL.
Los productos NO se repiten.

Lo que se repute es las aplicaciones y los materiales.

Los productos no se repiten.


Incluso, os diría mas...

- He buscado en la tabla productos_aplicaciones
---- Producto ID = 1
---- Aplicación ID = 12
-------- RESULTADOS: 1 fila

- He buscado en la tabla productos_materiales
---- Producto ID = 1
---- Material ID = 5
-------- RESULTADOS: 0 filas, no hay coincidencias, por lo que sería incorrecto este cruce.
  #20 (permalink)  
Antiguo 29/04/2014, 09:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

¿Y esta consulta, agrupando también por producto? Comprueba ahora los resultados.
Código MySQL:
Ver original
  1. SELECT p.PRODUCT_ID, IFNULL( COUNT( * ) , 0 ) total, pa.APPLICATION_ID, pm.MATERIAL_ID
  2. FROM `t_products` p
  3. LEFT JOIN t_products_applications pa ON p.PRODUCT_ID = pa.PRODUCT_ID
  4. LEFT JOIN t_products_materials pm ON p.PRODUCT_ID = pm.PRODUCT_ID
  5. GROUP BY p.PRODUCT_ID, pa.APPLICATION_ID, pm.MATERIAL_ID

Respecto a lo otro, claro que esta consulta no te dará todas las posibilidades, pero sí las que tienen datos. Lo otro te lo dará la primera consulta de mi post anterior. Luego uniremos ambas consultas, pero hay que comprobar antes que los datos son los esperados.
  #21 (permalink)  
Antiguo 29/04/2014, 10:35
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola a todos.


Finalmente mi consulta, para generar mi tabla, con los elementos a CERO y ordenados y agrupados como necesito es la siguiente:

Código MySQL:
Ver original
  1. SELECT t_applications.APPLICATION_ID, t_applications.APPLICATION_name_spanish, t_materials.MATERIAL_ID, t_materials.MATERIAL_name_spanish, count(t_products_materials.PRODUCT_ID)
  2. FROM t_applications CROSS JOIN t_materials
  3. LEFT JOIN t_products_applications ON t_products_applications.APPLICATION_ID = t_applications.APPLICATION_ID
  4. LEFT JOIN t_products_materials ON t_products_materials.PRODUCT_ID = t_products_applications.PRODUCT_ID
  5. AND t_products_materials.MATERIAL_ID = t_materials.MATERIAL_ID
  6. GROUP BY t_applications.APPLICATION_ID, t_applications.APPLICATION_name_spanish, t_materials.MATERIAL_ID, t_materials.MATERIAL_name_spanish
  7. ORDER BY t_applications.APPLICATION_name_spanish ASC, t_materials.MATERIAL_name_spanish ASC


Si le veis alguna manera de optimizarla, no dudéis en decírmelo.


Saludos.


Javier
  #22 (permalink)  
Antiguo 30/04/2014, 13:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi,
he borrado para sugerirte mi consulta
Código MySQL:
Ver original
  1. SELECT t_applications.APPLICATION_ID, t_applications.APPLICATION_name_spanish, t_materials.MATERIAL_ID, t_materials.MATERIAL_name_spanish, IFNULL( t1.total, 0 ) total
  2. FROM t_applications
  3. CROSS JOIN t_materials
  4.  
  5. SELECT COUNT( * ) total, pa.APPLICATION_ID, pm.MATERIAL_ID
  6. FROM t_products p
  7. INNER JOIN t_products_applications pa ON p.PRODUCT_ID = pa.PRODUCT_ID
  8. INNER JOIN t_products_materials pm ON p.PRODUCT_ID = pm.PRODUCT_ID
  9. GROUP BY pa.APPLICATION_ID, pm.MATERIAL_ID
  10. )t1 ON ( t_applications.APPLICATION_ID = t1.APPLICATION_ID
  11. AND t_materials.MATERIAL_ID = t1.MATERIAL_ID )
  12. ORDER BY t_applications.APPLICATION_name_spanish, t_materials.MATERIAL_name_spanish

He observado que en tu tabla una de las aplicaciones, arte, concretamente, aparece dos veces. Debes quitar una. Yo eliminé la que tiene índice 2 y dejé la 17, pues no parecía tener datos. Si no lo haces, aparecerá arte dos veces.

Comprueba si mi consulta te ofrece los resultados esperados y nos lo dices.

Última edición por jurena; 01/05/2014 a las 14:22 Razón: nueva propuesta
  #23 (permalink)  
Antiguo 02/05/2014, 03:57
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola jurena.

Tu consulta también funciona.
Pero... ¿qué es más óptimo?, trabajar con subconsulta y además los mismos LEFT JOINS que yo uso, o usar mi sentencia?

Dime o dame detalle de porqué es mejor tu subconsulta. ¿optimiza más? ¿nos da algo mejor?


Y respecto al repetido, es cierto, son elementos creados por el cliente y eliminados por él.
Hay un campo que es "APPLICATION_options_erased" (o MATERIAL_options_erased o PRODUCT_options_erased) que es el delimitador de si el elemento está borrado o no (y que he añadido como condición en la cláusula WHERE para que los elementos borrados no los cruce.


Gracias y un saludo.


Javier
  #24 (permalink)  
Antiguo 02/05/2014, 05:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

el_javi,
la verdad que no sabría decirte, aunque siempre se ha dicho que las subconsultas son menos eficientes. En cualquier caso, el problema ahora es saber si los resultados son los mismos exactamente en ambas consultas, y eso, salvo que tú me digas otra cosa, no lo tengo tan claro. Y en cualquier caso, los agrupados por nombres en español creo que te sobran.

saludos
  #25 (permalink)  
Antiguo 02/05/2014, 05:15
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Mega Consulta - Serían 252 conslutas - como optimizarlo

Hola jurena.

Cierto es que la agrupación por nombre de material y de aplicación sobra.
Lo arrastré de pruebas.

Mi consulta, con los añadidos de "no mostrar elementos borrados" sería así:

Código MySQL:
Ver original
  1. SELECT t_applications.APPLICATION_ID, t_applications.APPLICATION_name_spanish, t_materials.MATERIAL_ID, t_materials.MATERIAL_name_spanish, count(t_products_materials.PRODUCT_ID) TOTAL_PRODUCTS
  2. FROM t_applications CROSS JOIN t_materials
  3. LEFT JOIN t_products_applications ON t_products_applications.APPLICATION_ID = t_applications.APPLICATION_ID
  4. LEFT JOIN t_products_materials ON t_products_materials.PRODUCT_ID = t_products_applications.PRODUCT_ID AND t_products_materials.MATERIAL_ID = t_materials.MATERIAL_ID
  5. WHERE t_materials.MATERIAL_options_erased=0 AND t_applications.APPLICATION_options_erased=0
  6. GROUP BY t_applications.APPLICATION_ID, t_materials.MATERIAL_ID
  7. ORDER BY t_applications.APPLICATION_name_spanish ASC, t_materials.MATERIAL_name_spanish ASC

Mi consulta genera 252 resultados


La tuya, tal cual, genera 504, pero metiéndole las cláusulas de elementos borrados, se queda en 252


Los resultados, comparados uno con otros son exactamente los mismos (lo he mirado bien a fondo)


Me quedo con mi primera opción, por evitar el tema de "subconsultas"


Gracias de nuevo

Etiquetas: conseguir, 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 11:49.