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

预期结果:

身份证

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

也许您应该寻找用于父子关系的嵌套集模型。

在该模型中进行这样的查询要容易得多。

于 2012-04-01T16:37:40.027 回答
0

如果你想这样称呼它,我“开发”了另一个“解决方案”,因为它在技术上不再是一个单一的查询。

我写了一个 MySQL 程序,它完全符合我的要求。它搜索单个节点的所有父节点,然后搜索下一级的父节点,依此类推并检查是否找到新结果(需要检测循环以防它们发生,这应该由应用程序逻辑防止,但要在保存方面我还将最大距离限制为给定数量)。

但这确实很麻烦,并且必须针对需要使用的每个表进行修改。

我想我会坚持使用树模型,如果您想在多个组中调用它们,只需将“帐户”放入。这意味着帐户与组具有 1:n 关系,并且组与父组具有:1 关系(n 个组有 1 个父级,该父级可能有另一个父级,直到“根”节点(经典树))。

于 2012-04-02T12:41:22.580 回答