gpt4 book ai didi

mysql - 内部连接 ​​3 个表,可能有空表

转载 作者:行者123 更新时间:2023-11-29 01:57:58 25 4
gpt4 key购买 nike

这里我有 3 个表。我想拉所有参加过游戏 A 或游戏 B 或两者的人。这是我想要得到的维恩图:

Inner Join Venn Diagram

我显然希望有一个唯一的人员列表(没有重复)。我开始使用两个内部联接,但这只给了我所有 3 个表相交的内部圆圈(这是有道理的)。

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

  • 编号
  • 第一
  • 最后

游戏A

  • 类型标识
  • 入住时间
  • person_id

游戏B

  • 类型标识
  • 入住时间
  • 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 子查询,只返回 GameAGameB 中的 person_id 然后执行一个 INNER JOINPerson 限制为仅那些,或使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com