Tengo dos tablas en MySQL 5.1.38.Obtenga SUM en GROUP BY con JOIN usando MySQL
products
+----+------------+-------+------------+
| id | name | price | department |
+----+------------+-------+------------+
| 1 | Fire Truck | 15.00 | Toys |
| 2 | Bike | 75.00 | Toys |
| 3 | T-Shirt | 18.00 | Clothes |
| 4 | Skirt | 18.00 | Clothes |
| 5 | Pants | 22.00 | Clothes |
+----+------------+-------+------------+
ratings
+------------+--------+
| product_id | rating |
+------------+--------+
| 1 | 5 |
| 2 | 5 |
| 2 | 3 |
| 2 | 5 |
| 3 | 5 |
| 4 | 5 |
| 5 | 4 |
+------------+--------+
Mi objetivo es obtener el precio total de todos los productos que tienen una calificación de 5 estrellas en cada departamento. Algo como esto.
+------------+-------------+
| department | total_price |
+------------+-------------+
| Clothes | 36.00 | /* T-Shirt and Skirt */
| Toys | 90.00 | /* Fire Truck and Bike */
+------------+-------------+
Me gustaría hacer esto sin una subconsulta si puedo. Al principio intenté unirme con una suma().
select department, sum(price) from products
join ratings on product_id=products.id
where rating=5 group by department;
+------------+------------+
| department | sum(price) |
+------------+------------+
| Clothes | 36.00 |
| Toys | 165.00 |
+------------+------------+
Como se puede ver el precio para el departamento de juguetes es incorrecto, porque hay dos clasificaciones de 5 estrellas para la moto y, por tanto, contando que el precio dos veces debido a la unión.
Intenté agregar distinto a la suma.
select department, sum(distinct price) from products
join ratings on product_id=products.id where rating=5
group by department;
+------------+---------------------+
| department | sum(distinct price) |
+------------+---------------------+
| Clothes | 18.00 |
| Toys | 90.00 |
+------------+---------------------+
Pero el departamento de ropa está apagado porque dos productos comparten el mismo precio.
Actualmente mi solución consiste en tomar algo único sobre el producto (la identificación) y utilizarlo para que el precio sea único.
select department, sum(distinct price + id * 100000) - sum(id * 100000) as total_price
from products join ratings on product_id=products.id
where rating=5 group by department;
+------------+-------------+
| department | total_price |
+------------+-------------+
| Clothes | 36.00 |
| Toys | 90.00 |
+------------+-------------+
Pero esto se siente como un truco tan tonto. ¿Hay una mejor manera de hacer esto sin una subconsulta? ¡Gracias!
¿Qué tienes contra subconsultas? –
Mis combinaciones y condiciones son más complejas y dinámicas, y mi ORM (Active Record) no admite bien las subconsultas. – ryanb
¿Cómo sabes desde la segunda mesa a qué departamento pertenece la calificación? –