2012-02-25 3 views
1

집계를 수행하기 위해 테이블을 조인해야합니다. 나는 그것을 빨아 먹는다. 내 시나리오는 다음과 같습니다.집계를 위해 MySQL에 두 테이블 결합 하시겠습니까?

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

기본적으로 최상위 요소에는 부모가 없습니다. 그럼 ... 내가 끝낼 할

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 

어떤 아이디어를

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

있나요?

답변

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 

당신이 아이디어를 얻을 희망 ...

관련 문제