Hola alpe2000:
En realidad no estás tan alejado de la respuesta, sin embargo tienes algunos detalles a considerar:
1. en las cláusulas ON, es recomendable que sólo utilices aquellas condiciones que involucran a las llaves de las tablas, las condiciones para filtrar la información debes colocarlas en la sección WHERE.
2. Tienes un problema con las subconsultas, ya que NO ESTÁS AGRUPANDO POR PRODUCTO, por lo tanto, tanto el promedio como el conteo están arrojando un resultado general, no particular para un producto.
No es lo mismo poner esto:
a poner esto:
Código MySQL:
Ver originalSELECT id_producto opi_id_producto
, activo opi_act
, COUNT(*) total_opiniones
GROUP BY id_producto opi_id_producto
, activo opi_act
3. Evita el uso de SELECT *, esto tiene un pésimo rendimiento... aun cuando necesites TODOS los campos de una tabla (que es un caso poco común), es mejor que listes todos y cada uno de los campos.
El resto parece estar en orden, pero veamos si te queda más claro con este ejemplo.
Supongamos que tienes las siguientes tablas:
Código MySQL:
Ver original+-------------+-----------------+
| id_producto | descripcion |
+-------------+-----------------+
| 1 | producto uno |
| 2 | producto dos |
| 3 | producto tres |
| 4 | producto cuatro |
+-------------+-----------------+
+---------+-------------+------+
| id_voto | id_producto | voto |
+---------+-------------+------+
| 1 | 1 | 10 |
| 2 | 1 | 9 |
| 3 | 1 | 10 |
| 4 | 2 | 7 |
| 5 | 2 | 9 |
+---------+-------------+------+
+---------------+-------------+----------------+
| id_comentario | id_producto | comentario |
+---------------+-------------+----------------+
| 1 | 1 | comentario 1.1 |
| 2 | 1 | comentario 1.2 |
| 3 | 3 | comentario 3.1 |
+---------------+-------------+----------------+
es decir, tienes cuatro productos:
- el producto UNO tiene comentarios y votos
- el producto DOS solo tiene votos, pero no tiene comentarios
- el producto TRES solo tiene comentarios, pero no tiene votos
- el producto CUATRO no tiene ni comentarios ni votos
Ahora, para obtener el PROMEDIO de votos y el CONTEO de comentarios, tienes que hacer uso de las funciones de agrupación PERO UTILIZAR EL GROUP BY:
Código MySQL:
Ver originalmysql
> SELECT id_producto
, AVG(voto
) promedio_votos
+-------------+----------------+
| id_producto | promedio_votos |
+-------------+----------------+
| 1 | 9.6667 |
| 2 | 8.0000 |
+-------------+----------------+
mysql
> SELECT id_producto
, COUNT(id_producto
) total_comentarios
+-------------+-------------------+
| id_producto | total_comentarios |
+-------------+-------------------+
| 1 | 2 |
| 3 | 1 |
+-------------+-------------------+
Entonces si, puedes hacer los LEFT JOIN'S para asociar estas cantidades a sus productos:
Código MySQL:
Ver originalmysql
> SELECT p.id_producto
, p.descripcion
, v.promedio_votos
, c.total_comentarios
-> GROUP BY id_producto
) v
ON v.id_producto
= p.id_producto
-> GROUP BY id_producto
) c
ON c.id_producto
= p.id_producto
; +-------------+-----------------+----------------+-------------------+
| id_producto | descripcion | promedio_votos | total_comentarios |
+-------------+-----------------+----------------+-------------------+
| 1 | producto uno | 9.6667 | 2 |
| 3 | producto tres
| NULL | 1 | | 2 | producto dos
| 8.0000 | NULL | +-------------+-----------------+----------------+-------------------+
Haz los ajustes que te comento y si continuas con problemas, postea algunos datos de ejemplo de tus tablas y dinos en qué está fallando tu consulta.
Saludos
Leo