Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/01/2011, 14:39
Avatar de ecarlevaro
ecarlevaro
 
Fecha de Ingreso: octubre-2010
Ubicación: Paraná, Argentina
Mensajes: 80
Antigüedad: 14 años, 2 meses
Puntos: 13
Mensaje Respuesta: INNER JOIN con tres tablas y función SUM

Bueno así parece entonces que jurena es más rápido pero quimfv más efectivo.

Es que probé con ambas consulta luego de hojearlas y la de quimfv en su aparente complejidad funcionó muy bien mientras la de jurena hace lo mismo que la mía. Que por cierto, no devuelve como yo dije al principio la cantidad de registros de imagen de cada idArticulo en la DB sino que devuelve la cantidad de imágenes multiplicada por la cantidad de visitas, así un artículo con 6 imágenes y 335 visitas da 2010 "visitas".

Me acabo de desayunar el tema de las subconsultas en el Manual de MySQL para entender la consulta de quimfv, que si anda con ganas y tiempo le agradecería me explicara al menos a grandes rasgos, como fue razonando él para llegar a la consulta que llegó. Por mi parte entiendo esto:
Código SQL:
Ver original
  1. /*Las columnas que quiero*/
  2. SELECT articulos.idarticulo,
  3.        articulos.titulo,
  4.        sbcimagenes.src AS img,
  5.        SbCVisitas.SuVisitas AS Visitas
  6. FROM (articulos
  7.                LEFT JOIN
  8.                   /*Consigo todos los articulos y src de la imagen*/
  9.                   (SELECT img1.idArticulo,img1.src FROM imagenes AS img1
  10.                    INNER JOIN
  11.                     /*El menor idimg por cada articulo*/
  12.                     (SELECT idarticulo,MIN(idimg) AS MidImagen FROM imagenes GROUP BY idarticulo) AS img2
  13.                     /*Las uno por idimg y consigo todos los articulos con sus imagenes*/
  14.                     ON img1.idimg = img2.MidImagen) AS sbcimagenes
  15.                  /*Uno por idarticulo con articulos*/
  16.                 ON articulos.idarticulo = sbcimagenes.idarticulo)
  17.                 /*Combino las imagenes y los idarticulos con las estadisticas */
  18.                 LEFT JOIN (SELECT estadisticas.idarticulo,SUM(estadisticas.visitas) AS SuVisitas
  19.                                       FROM estadisticas
  20.                                       GROUP BY estadisticas.idarticulo) AS SbCVisitas
  21.                                       /*A través de idarticulo*/
  22.                  ON articulos.idarticulo = SbCVisitas.idarticulo;

Lo que también me gustaría entender es por qué falla la consulta mía o la de jurena, ¿por qué cuando le digo que SUM(estadisticas.visitas) multiplica la cantidad de registros de imagen por la cantidad de visitas?.

Bueno ando preguntón y disculpas si molesta, por mi parte las enormes gracias a quimfv porque creo que jamás hubiera llegado a tal consulta.