2012-02-25 8 views
1

集計を行うためにテーブルに参加する必要があります。私はそれを吸う。ここに私のシナリオがあります:集計のためにMySQLで2つのテーブルに結合しますか?

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

カテゴリレベルの数が限られていると仮定すると、一度に各レベルを結合することができます。

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 

は、あなたのアイデアを得る願っています...

:ここでは4つのレベルのためです
関連する問題