我想加入一个包含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
确认打字错误。现在我没有超过第一级继承期。谢谢被拒绝指出这一点。
更新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
答案 0 :(得分:4)
on p2.member_group_id = p1.member_group_id
它看起来像是错误。
也许你想输入
on p2.parent_group_id = p1.member_group_id
也许您应该为父子关系寻找嵌套集模型。
在该模型中进行这样的查询要容易得多。
答案 1 :(得分:0)
如果你想把它称之为“我开发了”另一个“解决方案”,因为它在技术上不再是单个查询了。
我编写了一个MySQL程序,它完全符合我的要求。它搜索所有父节点到单个节点,然后搜索下一级别的父节点,然后检查是否找到新结果(需要检测循环,以防它们发生,应该由应用程序逻辑阻止但是应该在保存方面我也限制了给定数量的最大距离。
但它确实是一个痛苦的屁股,必须针对需要使用的每个表进行修改。
我想我会坚持使用树模型,如果你想在多个组中调用它们,只需输入“帐户”。意味着一个帐户与组之间存在1:n关系,并且一个组与父母有一个关系(n个组有1个父级,该父级可能有另一个父级,直到“根”节点(经典树))。