4

グループ間の 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
4

2 に答える 2

4
on p2.member_group_id = p1.member_group_id

間違いのようです。

多分あなたはタイプしたかった

on p2.parent_group_id = p1.member_group_id

親子関係については、 Nested Set Modelを探す必要があるかもしれません。

そのモデルでは、このようなクエリを作成する方がはるかに簡単です。

于 2012-04-01T16:37:40.027 に答える
0

技術的にはもはや単一のクエリではないため、それを呼び出したい場合は、これに対する別の「ソリューション」を「開発」しました。

私はまさに私が望むことをするMySQLプロシージャを書きました。単一ノードのすべての親を検索し、次に次のレベルの親などを検索し、新しい結果が見つかったかどうかを確認します (発生した場合に備えてループを検出する必要があります。これはアプリケーション ロジックによって防止される必要がありますが、セーブ側も最大距離を特定の量に制限しました)。

しかし、それは本当に面倒で、使用する必要があるテーブルごとに変更する必要があります。

複数のグループでアカウントを呼び出したい場合は、ツリー モデルに固執し、「アカウント」を配置すると思います。つまり、アカウントはグループと 1:n の関係を持ち、グループは親と :1 の関係を持ちます (n 個のグループには 1 つの親があり、その親は「ルート」ノード (クラシック ツリー) まで別の親を持つ場合があります)。

于 2012-04-02T12:41:22.580 に答える