SQL中的多个多对多关系

时间:2018-03-20 17:36:41

标签: mysql sql many-to-many relational-database

如何在同一结果集中查询多个多对多关系?

我有两个表,我通常总是LEFT JOIN用于标准结果集:

tblPROJECTS -

id  |  jobnumber  |  jobname ...
--------------------------------------------------
1   |  1000       |  Project X
2   |  2000       |  Project Y
3   |  3000       |  Project Z

tblTASKS -

id  |  tasknumber |  jobnumber  |  taskname ...
--------------------------------------------------
1   |  10         |  1000       |  Project X: Task 1
2   |  20         |  1000       |  Project X: Task 2
3   |  30         |  2000       |  Project Y: Task 1

Tasknumber是一个GUID,独立于jobnumber,但永远不会与多个作业相关。

我在jobnumber上左右加入tblTASKS,因为并非所有项目都有任务(尚未)

但是我还有一个所有者表,它定义了拥有整个作业或个人任务(或两者)的1-n用户。每个用户可以拥有多个作业和/或任务。 DB的原始设计规定使用单个表。

tblOWNERS -

id  |  ownertype  |  ownerid  |  jobnumber  |  tasknumber ...
----------------------------------------------------------------
1   |  1          |  2        |  1000       |
2   |  1          |  4        |  1000       |
3   |  2          |  2        |             |  10

ownertype为1表示用户拥有整个作业。 ownertype为2表示用户拥有作业中的任务。

我正在尝试构建两个查询:

1)与所有员工工作所有者一起返回工作,并与所有相关任务所有者一起完成该工作的所有任务。

jobnumber |  jobowners | tasknumber | taskowners ...
1000      |  2,4,...   | 10         | 2
2000      |            | 20         | 4,6,8...
3000      |  4,5,6...  | 30         | 

2)给定所有者ID,返回与之关联的所有作业和/或任务。

这是来自/到同一桌子的多个多对多,让我难过。我可以做到这一点吗?如果是这样,我是在寻找某种UNION还是INTERSECT(我该怎么看?)或者,如果没有,那么这样的关系的更好的模式是什么呢?

TIA!

1 个答案:

答案 0 :(得分:1)

通常,您需要将外键放在ERD的许多端,因此在这种情况下,您可能在表'tblPROJECTS'中有一个名为'ownerid'的字段,以及在tblTASKS中有'ownerid'。假设所有任务都有作业ID和所有者,并且所有项目也有所有者,则可以使用INNER JOIN:

SELECT P.jobnumber,T.tasknumber,O1.id AS taskowner,O2.id AS jobowner
FROM tblTASKS T
INNER JOIN tblPROJECTS P ON P.jobnumber=T.jobnumber
INNER JOIN tblOWNERS O1 ON O1.id=T.ownerid
INNER JOIN tblOWNERS O2 ON O2.id=P.ownerid
WHERE O1.id=1

这不会像你所描述的那样连接作业所有者和任务所有者,但会为每个人返回一行,然后你可以在处理结果集时连接它。

然后根据需要替换WHERE子句以获取给定作业号的任务列表......

WHERE P.jobnumber=1000