这里我有 3 张 table 。我想拉出所有参加比赛 A 或比赛 B 或两者都参加的人。这是我想要得到的维恩图:
我显然希望有一个唯一的人员列表(没有重复)。我开始使用两个内部联接,但这只给了我所有 3 个表相交的内圆(这是有道理的)。
那么,我应该使用什么 JOIN 或组合来提取这些数据?
人
- ID
- 首先
- 最后
游戏A
- 类型ID
- checkin_time
- person_id
游戏B
- 类型ID
- checkin_time
- person_id
查询:
这是我尝试过的,它只返回参加过游戏 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
最佳答案
有几种方法可以做到这一点。一种方法是创建一个 UNION
子查询,仅返回来自 GameA
和 GameB
的 person_id
,然后执行 >INNER JOIN
将 Person
限制为仅限这些,或使用 IN()` 子查询:
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()
子查询:
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
关于mysql - 跨 3 个表(可能为空表)的内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23089907/