2012-02-25 6 views
1

Мне нужно объединить таблицы, чтобы сделать агрегацию. Я сосать. Вот мой сценарий:Объединение двух таблиц с MySQL для агрегации?

CATEGORIES 
CatID | CategoryName | Parent 
1  | Cars   | NULL 
2  | Electronics | NULL 
3  | DVD   | 2 
4  | Blu_ray  | 2 
5  | Shoes  | NULL 

Так что, в основном, самые верхние элементы не имеют родителей. Тогда я

PRODUCTS 
ProdID | Prod Name  | CatID 
1  | DVD Player 1  | 3 
2  | Blu-Ray Player | 3 
3  | Nike    | 5 
4  | DVD Player 2  | 3 

Я хочу, чтобы в конечном итоге ...

CATEGORIES 
CatID | CategoryName | Parent | totalProds 
1  | Cars   | NULL | 0 
2  | Electronics | NULL | 0 
3  | DVD   | 2  | 2 
4  | Blu_ray  | 2  | 1 
5  | Shoes  | NULL | 1 

Есть идеи?

ответ

1

Разве вы не просите об общем количестве продуктов для каждой категории?

SELECT CatID, CategoryName, Parent, COUNT(*) totalProds 
FROM categories c 
INNER JOIN products p ON p.CatID = c.CatID 
GROUP BY CatId 
0

Ниже запрос

SELECT 
    c.`CatID`, 
    c.`CategoryName`, 
    c.`Parent`, 
    COALESCE(COUNT(DISTINCT p.`ProdID`),0) AS totalProds 
FROM `CATEGORIES` c 
LEFT JOIN `PRODUCTS` p 
ON p.`CatID` = c.`CatID` 
ORDER BY c.`CatID` 

LEFT JOIN вернуть строку для каждой категории. COALESCE, чтобы убедиться, что при необходимости возвращается 0.

0

Предполагая, что у вас ограниченное количество уровней категорий, вы можете объединять каждый уровень за раз. Вот для 4-х уровней:

SELECT c1.CatID, c1.CategoryName, c1.Parent, COUNT(1) totalProds 
FROM products p 
INNER JOIN categories c1 ON c1.CatID = p.CatID 
GROUP BY c1.CatID, c1.CategoryName, c1.Parent 
UNION 
SELECT c2.CatID, c2.CategoryName, c2.Parent, COUNT(1) 
FROM products p 
INNER JOIN categories c1 ON c1.CatID = p.CatID 
INNER JOIN categories c2 ON c2.CatID = c1.Parent 
GROUP BY c2.CatID, c2.CategoryName, c2.Parent 
UNION 
SELECT c3.CatID, c3.CategoryName, c3.Parent, COUNT(1) 
FROM products p 
INNER JOIN categories c1 ON c1.CatID = p.CatID 
INNER JOIN categories c2 ON c2.CatID = c1.Parent 
INNER JOIN categories c3 ON c3.CatID = c2.Parent 
GROUP BY c3.CatID, c3.CategoryName, c3.Parent 
UNION 
SELECT c4.CatID, c4.CategoryName, c4.Parent, COUNT(1) 
FROM products p 
INNER JOIN categories c1 ON c1.CatID = p.CatID 
INNER JOIN categories c2 ON c2.CatID = c1.Parent 
INNER JOIN categories c3 ON c3.CatID = c2.Parent 
INNER JOIN categories c4 ON c4.CatID = c3.Parent 
GROUP BY c4.CatID, c4.CategoryName, c4.Parent 

Надеется, что вы получите идею ...

Смежные вопросы