跨表的MySQL嵌套集模型计数

时间:2011-05-20 22:14:07

标签: mysql nested nested-sets nested-class

我有一个使用嵌套集模型类来组织我的数据的应用程序,但是我正在尝试编写一个查询来计算每个组中的总人数。

table: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循环中运行,该循环列出了所有组名。

我正在尝试完成这样的结果:

Root - 成员(3)< -------请注意,我希望子组包含在计数中,并且我不希望成员被计算多次。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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

这适用于特定群体。如果您想在一个查询中获得每个成员计数的完整列表,则必须使用以下内容:

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

但是我认为在sql之外使用循环的第一个解决方案会更有效。