我有一个使用嵌套集模型类来组织我的数据的应用程序,但是我正在尝试编写一个查询来计算每个组中的总人数。
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)< -------请注意,我希望子组包含在计数中,并且我不希望成员被计算多次。
非常感谢任何帮助!
答案 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之外使用循环的第一个解决方案会更有效。