如何在需要重复的地方加入?

时间:2019-03-11 07:11:15

标签: mysql sql database

我有一个像这样的表结构

表1

PersonID, referrer

表2

Event_A_ID, PersonID, status

表3

Event_B_ID, PersonID, status

我想通过加入referrer=X之类的所有事件表并检查PersonID,从具有Event_A...K的表中获取每个人的事件状态。由于人们可以出现在多个事件中,所以我们可以遇到这样的情况

PersonID=1001, EventA_ID, referrer=X, status
PersonID=1001, EventB_ID, referrer=X, status
PersonID=1001, EventK_ID, referrer=X, status
PersonID=1002, ...
PersonID=1003, ...

但是我不确定如何联接所有事件表,因为ID可以重复(并且是需要的)。

我尝试单独选择并使用in语法

...
WHERE 1=1
AND PersonID IN (SELECT PersonID from table1 where referrer=X)

但是后来我意识到之前的所有事情都是事件的汇总。

我应该从Table1中的SELECT开始吗?首先选择有效的ID,然后再从事件中选择?如果是这样,我如何加入?我觉得理想状态看起来像所有事件表的并集,然后选择

3 个答案:

答案 0 :(得分:2)

您可以将union all用于数据的按行实现,或者如果表事件较少,还可以在表之间使用内部联接。这将以列格式表示数据。

SELECT * FROM tb2 AS t2 INNER JOIN tb3 t3 ON t2.personId = t3.personId INNER JOIN tb1 t1 ON t1.personId = t2.personId WHERE t1.refer='refer1'

根据要连接的表的数量,也可以有许多其他方法。

您还应该考虑在数据库表之间使用更好的关系,因为当前情况将导致您拥有的表数量与事件的数量一样多。这会导致检索多个事件的数据变慢。

答案 1 :(得分:1)

使用union all,然后应用join

select a.person_id,a.referrer,b.eventID,b.PersonID,b.status from Table1 a inner join
(
select Event_A_ID as eventID, PersonID, status from Table2
union all
select Event_B_ID as eventID, PersonID, status from Table3
)b on a.personid=b.personid

答案 2 :(得分:0)

您可以使用左联接执行以下操作:

SELECT t1.PersonID, t1.referrer, 
t2.Event_A_ID, t2.status as status_a, 
t3.Event_B_ID, t3.status as status_b
.
.
.
FROM table1 t1
LEFT JOIN table2 t2 ON t2.PersonID = t1.PersonID
LEFT JOIN table3 t3 ON t3.PersonID = t1.PersonID
.
.
.
WHERE t1.referrer = 'x'