这里我有3张桌子。我想拉出参加比赛A或比赛B或两者的所有人。这是我想要得到的维恩图:
我显然希望拥有一个独特的人员列表(没有重复项)。我开始使用两个内连接,但这只给了我所有3个表相交的内圆(这是有意义的)。
那么,我应该使用什么JOIN或组合来提取这些数据?
人
GameA
GameB
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
答案 0 :(得分:3)
有几种方法可以做到这一点。一种方法是使UNION
子查询仅从person_id
和GameA
返回GameB
,然后执行INNER JOIN
将Person
限制为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}}