Получите всех пользователей в группе верхнего уровня (все пользователи являются членами этой группы, но исключают пользователей, которые также являются членами других, дочерних групп)

Теоретически у меня есть две таблицы: пользователи, группы и третья таблица user_group, которая их объединяет (сообщает, какие пользователи в какой группе).

Вот как устроены группы (в виде дерева):

1 корень

1.1 ребенок1

1.2 ребенок2

ВСЕ пользователи входят как минимум в группу root. Кроме того, они могут быть (но не обязательно) назначены другой группе, которая является дочерней группой корневой группы (например, дочерняя1 или дочерняя2).

Учитывая идентификатор группы, я хотел бы получить пользователей ТОЛЬКО этого идентификатора группы. Забавная часть заключается в следующем сценарии: если предоставлен идентификатор корневой группы, мы должны получить только тех пользователей, которые присутствуют ТОЛЬКО в корневой группе - они не должны быть членами какой-либо другой дочерней группы.


person Dzhuneyt    schedule 10.03.2014    source источник


Ответы (1)


Есть еще один, но довольно раздражающий способ:

SELECT *
FROM (
  SELECT idUser, idGroup
  FROM UserGroup
  GROUP BY idUser
  HAVING COUNT(idGroup) < 2
)
WHERE idGroup = <group's id you're looking for>

Я сказал раздражает, потому что мне не нравятся двойные выборки.

Старый ответ ниже:

С такой структурой:

Users      UserGroup      Groups
------     -----------    ------
idUser     idUserGroup    idGroup
           idUser
           idGroup

Вы можете попробовать это:

SELECT DISTINCT idUser
FROM UserGroup AS UG
WHERE UG.idGroup=1
GROUP BY UG.idGroup

Где 1 в предложении where находится idGroup, которую вы хотите найти:

 WHERE UG.idGroup=<idGroup>
person cbcram    schedule 10.03.2014
comment
Правильно, но он также будет извлекать пользователей, которые одновременно находятся в корневой группе и в группах, дочерних для root. Я хотел бы получить только тех, кто находится в корне, но не в других группах. - person Dzhuneyt; 10.03.2014