我有一个entities
表,可以使用第二个junction
表彼此之间建立多对多关系。乍一看,设计可能看起来有缺陷,并为每种类型的实体建议一个单独的表。问题是,实体是通用的,完全是用户定义的。它们也可以完全临时连接,每个实体可以具有无限数量的连接。
这是我的表的简化示例:
Entities
------------
Entity | Id | Type
-------------------
Event | 1 | Request
Stroll | 2 | Activity
Dinner | 3 | Activity
Angela | 4 | Person
Anders | 5 | Person
Michael | 6 | Person
Junctions
----------------
Left | Right
----------------
1 | 2 // Connect Request -> Stroll
2 | 4 // Connect Stroll -> Angela
1 | 3 // Connect Request -> Dinner
3 | 5 // Connect Dinner -> Anders
3 | 6 // Connect Dinner -> Michael
现在问我的问题:
我想从不同实体的观点来查询查询。假设我想查看请求,看看他们有哪些活动,以及参加每项活动的人员。我想得到这样的结果:
Request | Activity | Person
-----------------------------
Event | Stroll | Angela
| Dinner | Anders
| Michael
例如,我也希望能够翻转硬币并查看人员并查看他们参加的请求,例如:
Person | Request
-----------------
Angela | Event
Anders | Event
Michael | Event
如何编写查询来实现这样的结果,甚至可以使用当前结构?我花了很多时间在谷歌搜索和试验没有运气,我非常感谢任何帮助。
答案 0 :(得分:1)
你就是这样做的
SELECT e1.Entity Request,
e2.Entity Activity,
e3.Entity Person
FROM Junctions j1
JOIN Junctions j2
ON j1.`Right` = j2.`Left`
JOIN Entities e1
ON j1.`Left` = e1.Id
JOIN Entities e2
ON j1.`Right` = e2.Id
JOIN Entities e3
ON j2.`Right` = e3.Id;
为了帮助您理解 - 首先我加入Junctions
就像这样:
SELECT j1.`Left` Request,
j1.`Right` Activity,
j2.`Right` Person
FROM Junctions j1
JOIN Junctions j2
ON j1.`Right` = j2.`Left`;
然后加入Entity
,如您所见,替换Id
。每个type
一次。
但是,尽管如此,我仍然认为这种架构很糟糕,需要重新设计。