2014-01-26 38 views
0

我有两个表。表名称类别项目。我想列出具有项目数量的类别。递归类别下的项目数

表:

id | parent | catname | catpath 
1 0  A   1 
2 0  B   2 
3 1  A1  1,3 
4 3  A11  1,3,4 
5 2  B1  2,5 
6 0  C   6 

....

项目表:

id | catid | title 
1 1  title1 
2 1  title2 
3 3  title3 
4 4  title4 
5 4  title5 
6 3  title6 
7 5  title7 

而且我要打印类是这样的: 打印catname(ITEMCOUNT =自己的物品数量+子类别的物品数量)

A (4) /*<- sub category's item count + own item count*/ 
    A1 (1) 
    A11 (2) 
B (1) 
    B1 (1) 

UPDATE: SQLFIDDLE

回答

1

,因为你必须在类表的完整路径,你可以做到这一点。荣誉。所以,你并不需要一个递归查询:

select c.catname, count(ic.catid) as cnt 
from categories c left outer join 
    (select i.*, c.catname, c.catpath 
     from items i join 
      categories c 
      on i.catid = c.id 
    ) as ic 
    on concat(ic.catpath, ',') like concat(c.catpath, ',%') 
group by c.catname; 

这使用like遍历层次。 ,的原因是这样1不匹配10.

+0

谢谢。给我正确的结果。谢谢! – maverabil

+0

我遇到问题。当我添加一个类别catname = C.我看不到结果C.如果没有C类别的项目不给这行。 – maverabil

+1

@maverabil。 。 。一个'left outer join'修复了这个问题。 –