内部加入3个表,可能有空表

时间:2014-04-15 16:53:08

标签: mysql

这里我有3张桌子。我想拉出参加比赛A或比赛B或两者的所有人。这是我想要得到的维恩图:

Inner Join Venn Diagram

我显然希望拥有一个独特的人员列表(没有重复项)。我开始使用两个内连接,但这只给了我所有3个表相交的内圆(这是有意义的)。

那么,我应该使用什么JOIN或组合来提取这些数据?

  • id
  • 第一
  • 最后

GameA

  • typeid的
  • checkin_time
  • 为person_id

GameB

  • typeid的
  • checkin_time
  • 为person_id

QUERY:

这就是我所尝试过的,只会让那些参加过A和B场比赛的人回归:

 SELECT * FROM Person 
 INNER JOIN GameA ON Person.id = GameA.person_id 
 INNER JOIN GameB ON Person.id = GameB.person_id

我也可以使用此查询获得所需的结果,但我不确定是否有更好的方法可以实现此目的:

SELECT * FROM Person, GameA, GameB
WHERE Person.id = GameA.person_id OR Person.id = GameB.person_id
GROUP BY Person.id

1 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。一种方法是使UNION子查询仅从person_idGameA返回GameB,然后执行INNER JOINPerson限制为SELECT DISTINCT Person.* FROM Person INNER JOIN ( SELECT person_id FROM GameA UNION SELECT person_id FROM GameB ) attendees ON Person.id = attendees.person_id 只是,或使用IN()`子查询:

IN()

或者,SELECT DISTINCT Person.* FROM Person WHERE id IN ( SELECT person_id FROM GameA UNION SELECT person_id FROM GameB ) 子查询:

UNION

在外面执行FOREIGN KEY可能比其中任何一个更快。如果您在必要时定义了INNER JOIN个关系,从而强制执行索引,则可以执行UNION两次,然后SELECT p.* FROM Person p INNER JOIN GameA ON p.id = GameA.person_id UNION SELECT p.* FROM Person p INNER JOIN GameB ON p.id = GameB.person_id 结果:

{{1}}