Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/11/2014, 11:42
alpe2000
 
Fecha de Ingreso: enero-2008
Ubicación: Málaga - España
Mensajes: 346
Antigüedad: 16 años, 3 meses
Puntos: 13
Join 4 tablas

Saludos cordiales,
Tengo 4 tablas: (pongo los campos relevantes)

Productos
producto_id,descripcion,activo

Productos_a_subcategias
id,producto_id,subcategoria_id

comentarios
id,producto_id

votos
id,producto_id

Lo que hago ahora:
Selecciono todos los productos de la tabla productos que esten condicionados con la subcategoria a la que pertenece

Código MySQL:
Ver original
  1. SELECT * FROM productos p
  2. INNER JOIN productos_a_subcategorias pas ON p.producto_id = pas.producto_id
  3. WHERE pas.subcategoria_id = 27 AND p.activo = TRUE

Despues, pues en programacion, recorro el recordset y para cada uno de los productos, hago la media de los votos:

Código MySQL:
Ver original
  1. SELECT AVG(voto) as media_votos FROM valoracion_producto WHERE producto_ID = 1

Y tambien cuento la cantidad de comentarios que tiene cada uno:

Código MySQL:
Ver original
  1. Select COUNT(*) from opiniones Where id_producto = 1

Esto creo que es malgastar recursos del servidor, ademas de que asi, no puedo ordenar los resultados, por ejemplo, por producto mas comentado o mas valorado.

Y he probado haciendo algunas pruebas con INNER JOIN, LEFT JOIN, pero mis conocimientos son basicos y no me aclaro.
Esto es lo que llevo ahora, pero no funciona bien :(

Código MySQL:
Ver original
  1. SELECT * FROM productos p
  2. INNER JOIN productos_a_subcategorias pas ON p.producto_id = pas.producto_id AND pas.subcategoria_id = 27 AND p.activo = TRUE
  3. LEFT JOIN (SELECT id_producto opi_id_producto,activo opi_act,COUNT(*) total_opiniones FROM opiniones ) opi ON p.producto_id = opi.opi_id_producto AND opi.opi_act = TRUE
  4. LEFT JOIN (SELECT producto_id voto_producto_id,AVG(voto) as voto_media_votos FROM valoracion_producto) voto ON p.producto_id = voto.voto_producto_id

Alguna ayuda me vendrá genial, llevo dos dias haciendo pruebas, pero no doy con la tecla.