【问题标题】:SQL n:m Inheritance joinSQL n:m 继承连接
【发布时间】:2012-04-01 16:33:43
【问题描述】:

我想加入一个包含组之间 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

【问题讨论】:

  • 您的预期结果是什么?请以表格格式给出一些示例
  • 有关预期结果,请参见上面的 update2。基本上我想要给定表(在示例 1 中)直接或间接继承的所有表。

标签: mysql sql inheritance join nm


【解决方案1】:
on p2.member_group_id = p1.member_group_id

看起来像个错误。

也许你想输入

on p2.parent_group_id = p1.member_group_id

也许您应该为父子关系寻找嵌套集模型

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

【讨论】:

  • 这是行不通的,因为一个组可以在 N 个其他组中,而这些组又可以在 N 个组中,依此类推...
  • 如果你有多对多的关系(据我所知) - 那么你应该使用另一个表来存储关系。例如,表 groups_relations(parent_id number, child_id number)
  • (我不能使用嵌套父子关系的原因是它们类似于树状模型。这意味着一个分支中的组不能成为另一个分支中的组的成员。)
  • 我上面描述的那个表正是你刚才描述的。包含组、它们的名称等的表是一个单独的表。上表仅用于映射多对多关系(也称为 n:m(n 到 m))。
  • 哦,很抱歉 - 您的表已经为存储多对多关系创建了 :)
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2021-09-03
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多