我有以下表格:
Categories
=================================
CategoryID | ParentID | Text
---------------------------------
1 NULL Text
2 1 Text
3 NULL Text
4 1 Text
Items
=================================
ItemID | CategoryID | Text
---------------------------------
1 1 Text
2 2 Text
3 4 Text
4 3 Text
请记住,这不是一个n级层次结构,类别只有2个级别,因此例如,没有类别的parentID为2。
我正在寻找的方法是使用额外的列返回类别,该列显示该类别拥有的项目数(包括其子类别)。
即。我正在寻找一个可以返回如下内容的单个查询(或过程):
Categories
============================================
CategoryID | ParentID | Text | Count
--------------------------------------------
1 NULL Text 3
2 1 Text 1
3 NULL Text 1
4 1 Text 1
我目前获取与某个类别相关联的项目的方法如下(给定categoryID,@ CategoryID):
SELECT * FROM Items
WHERE CategoryID
IN (SELECT CategoryID FROM Categories where ParentID = @CategoryID or CategoryID = @CategoryID)
我的问题是我似乎无法将此链接与类别本身的选择查询相关联。 它可能非常简单,但我尝试过使用CTE的方法,各种group by子句,但类别的层次性似乎让我的逻辑失去了。
感谢您的帮助!
编辑:查询还需要考虑没有与之关联的项目的类别
答案 0 :(得分:3)
您必须将项目加入类别,并从类别表中分组您需要的任何字段:
SELECT c.CategoryID
, c.ParentID
, c.Text
, count(distinct i.ItemID)
FROM Categories c
LEFT JOIN
Categories c2
ON c.CategoryID = c2.ParentID
LEFT JOIN
Items i
ON i.CategoryID = c.CategoryID
or i.CategoryID = c2.CategoryID
GROUP BY
c.CategoryID
, c.ParentID
, c.Text