Mam dwie tabele w MySQL 5.1.38.Suma w GROUP BY przy JOIN przy użyciu 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 |
+------------+--------+
Mój cel to uzyskanie całkowitej ceny wszystkich produktów, które mają 5 gwiazdek w każdym dziale. Coś takiego.
+------------+-------------+
| department | total_price |
+------------+-------------+
| Clothes | 36.00 | /* T-Shirt and Skirt */
| Toys | 90.00 | /* Fire Truck and Bike */
+------------+-------------+
Chciałbym zrobić to bez podzapytania, jeśli mogę. Na początku próbowałem połączyć z sumą().
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 |
+------------+------------+
Jak widać cenę za dział zabawek jest błędna, ponieważ istnieją dwa wskaźniki 5-gwiazdkowe na rower i dlatego liczy, że cena dwukrotnie z powodu łączenia.
Potem próbowałem dodawać odrębne do sumy.
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 |
+------------+---------------------+
Ale wtedy dział ubrań jest wyłączony, ponieważ dwa produkty mają tę samą cenę.
Obecnie moja praca polega na zrobieniu czegoś wyjątkowego na temat produktu (identyfikatora) i wykorzystaniu go, aby cena była unikalna.
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 |
+------------+-------------+
Ale to wygląda jak głupi hack. Czy jest lepszy sposób to zrobić bez podzapytania? Dzięki!
Co masz przeciwko podzapytania? –
Moje połączenia i warunki są bardziej złożone i dynamiczne, a moje ORM (rekord aktywny) nie obsługuje dobrze podkwerend. – ryanb
Skąd wiesz od drugiej tabeli, do której działu wystawia się ocena? –