Количество моделей вложенных множеств MySQL в разных таблицах - PullRequest
1 голос
/ 21 мая 2011

У меня есть приложение, которое использует класс модели вложенного набора для организации моих данных, однако я пытаюсь написать запрос, который будет подсчитывать общее количество людей в каждой группе.

таблица: 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) <------- Обратите внимание, что я хочу, чтобы подгруппы были включены в подсчет, и я не хочу, чтобы участники подсчитывались более одного раза. </p>

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 21 мая 2011

Поскольку вы запускаете его в цикле 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 было бы более эффективным.

...