グループ間の 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++ ソース コードでいつでもこれを行うことができると思いますが、アプリケーション サーバーに大きな成長の可能性があるテーブル全体を転送する必要があります。)
アップデート:
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
記入ミス確定。今、私は継承期間の最初のレベルを過ぎていません。それを指摘してくれてありがとう。
UPDATE2: 期待される結果
id | group_id | member_group_id
--------------------------------
1 | 1 | 2
2 | 2 | 3
3 | 3 | 4
4 | 4 | 5
5 | 5 | 6
6 | 6 | 7
期待される結果:
ID
2
3
4
5
6
7