2014-09-27 173 views
0

這是產品選擇產品計數爲每個類別中,當產品在子類別

PROD_ID  CATEG_ID 
1   2 
2   21 
3   211 
4   5 
5   51 

表結構這是類別的表格結構

CATEG_ID PARENT_CATEG_ID 
2   NULL 
5   NULL 
21   2 
211   21 
51   5 

我有困難時爲每個類別選擇產品數量,包括嵌套類別。 例如,2類別有1個產品,21類別有1個產品,211類別有1級的產品,並且由於類別21221是類別2的各自直接/間接祖先,2類別有3種產品。所以我需要一個查詢或只是一種方式來得到這樣的東西:

CATEG_ID PARENT_CATEG_ID PRODUCT_COUNT 
2   NULL    3 (including product count for categories 21 and 221) 
5   NULL    2 (including product count for category 51) 
21   2     2 (including product count for category 221) 
211   21     1 (no category ancestor, only product count for self) 
51   5     1 (no category ancestor, only product count for self) 

是隻有SQL可能或我需要添加一些PHP?

+0

執行類別跟隨其中獲得Ÿ去除ID的最後一位家長這樣漂亮的圖案? – 2014-09-27 11:25:38

+0

@Gordon Linoff他們是,但是,我不能依靠它 – 2014-09-27 11:43:54

+0

然後測試從「a_horse_with_no_name」的答案,並接受並upvote它,如果正確。 – 2014-09-27 11:50:53

回答

2

下應該這樣做:

with recursive cat as (
    select categ_id, 
     parent_categ_id, 
     categ_id as root_category, 
     1 as level 
    from categories 
    where parent_categ_id is null 
    union all 
    select c.categ_id, 
     c.parent_categ_id, 
     p.root_category, 
     p.level + 1 
    from categories c 
    join cat as p on p.categ_id = c.parent_categ_id 
) 
select c.categ_id, 
     p.prod_id, 
     (select count(*) from cat c2 where c2.level >= c.level and c2.root_category = c.root_category) as cnt 
from cat c 
    left join products p on p.categ_id = c.categ_id 
; 

遞歸查詢首先構建整個目錄樹。它返回每個類別的根類別以及特定根類別的子樹內類別的嵌套級別。該CTE本身返回此:

 
categ_id | parent_categ_id | root_category | level 
---------+-----------------+---------------+------ 
     2 |   (null) |    2 |  1 
     21 |    2 |    2 |  2 
    211 |    21 |    2 |  3 
     5 |   (null) |    5 |  1 
     51 |    5 |    5 |  2 

這隨後被用於加入對產品表,並做包含在同一根類別的產品的運行總和(這是count(p.prod_id) over (partition by c.root_category order by level desc)部分)。因此,完整的查詢的結果是這樣的:

 
categ_id | prod_id | product_count 
---------+---------+-------------- 
     2 |  1 |    3 
     21 |  2 |    2 
    211 |  3 |    1 
     5 |  4 |    2 
     51 |  5 |    1 

SQLFiddle:http://sqlfiddle.com/#!15/d6261/15

+0

好的答案夥計!請告訴我,這是想要的行爲? http://sqlfiddle.com/#!15/d6261/11它會返回每個產品行中每個根類別的產品數量 – 2014-09-27 12:33:12

+0

@IvanHanák:請參閱我的編輯 - 儘管我不認爲該解決方案的性能會很好。 – 2014-09-27 13:32:50

相關問題