Я хочу присоединиться к таблице, которая содержит отношения n: m между группами. (Группы определены в отдельной таблице).
В этой таблице есть только записи, перечисляющие member_group_id и parent_group_id.
Учитывая эту структуру:
id(int) | member_group_id(int) | parent_group_id(int)
«Базовый» запрос выглядит так:
select p1.group_id, p2.group_id, p1.member_group_id, p2.member_group_id
from group_member_group as p1
join group_member_group as p2
on p2.member_group_id = p1.member_group_id
«Базовый» запрос корректно показывает все отношения (я проверял, делая это вручную.)
Проблема в том, что когда я пытаюсь применить предложение where к этому запросу, чтобы отфильтровать определенную группу как «точку происхождения» (первая группа, для которой мне нужны все родительские группы), он возвращает только ближайших родителей. Например, как это:
select p1.group_id, p2.group_id, p1.member_group_id, p2.member_group_id
from group_member_group as p1
join group_member_group as p2
on p2.member_group_id = p1.member_group_id
where p1.group_id = 1
Может кто-нибудь дать подсказку, как я могу это исправить? Или другой подход, чтобы понять это. (Полагаю, я всегда мог сделать это в исходном коде C ++ на стороне сервера, но мне пришлось бы перенести всю таблицу с высоким потенциалом роста на сервер приложений.)
UPDATE:
select p1.group_id, p2.group_id, p1.member_group_id, p2.member_group_id
from group_member_group as p1
join group_member_group as p2
on p2.group_id = p1.member_group_id
Ошибка ввода подтверждена. Теперь я не могу пройти первый уровень периода наследования. Спасибо, что отказали в указании на это.
ОБНОВЛЕНИЕ2: Ожидаемый результат
id | group_id | member_group_id
--------------------------------
1 | 1 | 2
2 | 2 | 3
3 | 3 | 4
4 | 4 | 5
5 | 5 | 6
6 | 6 | 7
ожидаемый результат:
идентификаторы
2
3
4
5
6
7