Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/01/2011, 23:19
Avatar de ecarlevaro
ecarlevaro
 
Fecha de Ingreso: octubre-2010
Ubicación: Paraná, Argentina
Mensajes: 80
Antigüedad: 13 años, 6 meses
Puntos: 13
Pregunta INNER JOIN con tres tablas y función SUM

Bueno, siendo la 01:59 AM me rendí del infalibre método de prueba y error (agotado ya el método de leer el manual de MySQL) y decidí consultar.

Tengo tres tablas, ARTICULOS, IMAGENES, ESTADISTICAS.

Las tres tablas comparten la columna idarticulo.

Por cada registro de artículos puede haber cero o muchos registros en imágenes (las imágenes del artículo).

Por cada registro de articulos puede haber cero o muchos registros en estadísticas (básicamente cada visita de cada fecha a cada artículo se registra en ESTADÍSTICAS).

Yo necesito saber el idarticulo, la primera imagen guardada, y el total de visitas (para todas las fechas) por cada articulo.

Es decir, el resultado que necesito sería:

IDARTICULO IMAGEN VISITAS
1 hola.jpg 38
2 gaylord.jpg 12
Donde visitas es la suma de todas las visitas a cada artículo para todas las fechas.

En ESTADISTICAS los registros basicamente son así:

IDARTICULO FECHA VISITAS
1 18/01 1
1 19/01 2
2 20/01 5

Entonces para obtener el total de visitas por artículo hago un SUM(estadisticas.visitas) y un GROUP BY articulos.idarticulo.

Ahora bien, para conseguir la primer imagen de cada artículo, me aprovecho de la columna idimagen de la tabla IMAGENES, y lo consigo con MIN(imagenes.idimg) y imagenes.imagen, también con un GROUP BY articulos.idarticulo que me devuelve una imagen por cada artículo.

El problema es que cuando junto todo en una consulta, todo anda bien, excepto el SUM(estadisticas.visitas) que devuelve la cantidad de imágenes para cada artículo, no suma las visitas, sino devuelve la cantidad de imágenes (de registros en la tabla IMAGENES para cada artículo) en vez de sumar las visitas suma la cantidad de registros de imagen para cada artículo.

La consulta que hago es:

Código MySQL:
Ver original
  1. SELECT articulos.idarticulo,SUM(estadisticas.visitas) as visitas, imagenes.imagen,MIN(imagenes.idimg) FROM (articulos LEFT JOIN estadisticas ON articulos.idarticulo = estadisticas.idarticulo) INNER JOIN imagenes ON articulos.idarticulo = imagenes.idarticulo GROUP BY articulos.idarticulo ORDER BY idarticulo ASC

Uso LEFT JOIN pues no todos los artículos tienen un registro en ESTADÍSTICAS pues algunos no tienen visitas todavía.

Y me devuelve algo así:

IDARTICULO IMAGEN VISITAS
1 hola.jpg 5
2 gaylord.jpg 3

donde 5 y 3 ¡no son las sumas de las visitas para las distintas fechas del artículo 1 y 2! son la cantidad de imágenes (registros en IMAGENES) del artículo 1 y 2.

Si alguien anda con suficientes ganas de meterse en este problema le agredeceré, mientras seguiré probando...