2011-05-20 100 views
1

我有一個應用程序使用嵌套集模型類來組織我的數據,但我試圖編寫一個查詢來計算每個組中的總人數。跨表的嵌套集模型計數

表:person_to_group

----+------------+----------- 
|ID | Person_ID | Group_ID | 
----+------------+----------- 
| 1 | 3   | 1   | 
| 2 | 3   | 2   | 
| 3 | 5   | 2   | 
| 4 | 7   | 3   | 
----+------------+----------- 

表:組

----------+--------------+--------------+------------- 
|Group_ID | Group_Name | Group_Left | Group_Right | 
----------+--------------+--------------+------------- 
| 1  | Root   | 1   | 6   | 
| 2  | Node   | 2   | 5   | 
| 3  | Sub Node  | 3   | 4   | 
----------+--------------+--------------+------------- 

我的查詢將while循環,其中列出所有的組名內運行。

我試圖完成這樣的結果:

根 - 會員(3)< -------請注意,我想包括在數個亞類,我不希望成員不止一次被計數。

任何幫助將不勝感激!

回答

1

既然你運行它的組名,你可能可以拿到小組第一的左,右值而不是把他們變成這個查詢while循環中:

SELECT count(*) AS members FROM 
(SELECT DISTINCT ptg.person_ID FROM groups g 
JOIN person_to_group ptg 
ON ptg.Group_ID=g.Group_ID 
WHERE g.Group_Left >= 1 
AND g.Group_Right <= 6) m 

這適用於給定組。如果你想獲得小組與成員的完整列表,計算每個在一個查詢中,你將不得不使用這樣的:不過我覺得用sql的外循環中的第一個解決方案會更有效

SELECT m.Group_Name, count(*) AS members FROM 
    (SELECT g.Group_ID, g.Group_Name, ptg.Person_ID 
    FROM groups g 
    JOIN groups gsub 
     ON gsub.Group_Left >= g.Group_Left AND gsub.Group_Right <= g.Group_Right 
    JOIN person_to_group ptg 
     ON gsub.Group_ID = ptg.Group_ID 
    GROUP BY g.Group_ID, ptg.Person_ID) m 
GROUP BY m.Group_ID 

+0

謝謝piotrm。你的第一個解決方案完美運作 – Rich 2011-05-21 19:31:34