Category表结构(无限分类结构)
CategoryId,CategoryName,ParentIdNews表(其中Category1,Category2,Category3分别表示一级分类,二级分类,三级分类)
Category1,Category2,Category3,NewsId,Title...需求是统计出所有三级分类下的新闻数量,通过下面语句可以得到1级分类的,二、三级的不会弄
select c1.CategoryId,COUNT(n.NewsId) AS Count from News as n 
 LEFT JOIN Category as c1 ON n.Category1=c1.CategoryId 
 GROUP BY c1.CategoryId

解决方案 »

  1.   

    太抽象化了..能给出个具体的实例以及要求的结果比较合适.你只给出了字段.对于各字段下都是些什么内容还不清楚比如你的News表..里面包含了3个分类字段..同时又有新闻的ID和标题字段.但是是否每条新闻都对应3个分类?还是什么?
      

  2.   

    select COUNT(*) as 一级数 from news  where Category1 in
    (
    select 一级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )select COUNT(*) as 二级数 from news  where Category2 in
    (
    select 二级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )select COUNT(*) as 三级数 from news  where Category3 in
    (
    select 三级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )
      

  3.   


    with cte as (
    select n.Category1,n.Category2,n.Category3,c1.CategoryId ,n.NewsId from News as n 
     LEFT JOIN Category as c1 ON n.Category1=c1.CategoryId 
    )
    select n.Category1 ,count(NewsId) as Count from cte   
    /****
    既然n.Category1=c1.CategoryId  那统计一级的时候可以用Category1这个字段,
    那统计二级的时候可以用Category2
    三级的时候可以用Category3,依次类推就可以了
    ****
      

  4.   

    select 1 as 分类,COUNT(*) as 新闻数量 from news  where Category1 in
    (
    select 一级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )
    union
    select 2,COUNT(*) from news  where Category2 in
    (
    select 二级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )
    union
    select 3,COUNT(*) from news  where Category3 in
    (
    select 三级 from(
    select a.CategoryId as 一级,b.CategoryId as 二级,c.CategoryId as 三级 from Category a
    left join Category b on b.ParentIdID=a.CategoryId
    left join Category c on c.ParentId=b.CategoryId) a
    )我直接拿上面哥们的代码无脑改下,哥们别介意。