mysql - 跨 3 个表(可能为空表)的内连接

标签 mysql

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

Inner Join Venn Diagram

我显然希望有一个唯一的人员列表(没有重复)。我开始使用两个内部联接,但这只给了我所有 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 子查询,仅返回来自 GameAGameBperson_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/

相关文章:

mysql - 在树莓派中为 python 3 安装 mysql 连接器

mysql - 如何使用逗号从数据库中选择数据

mysql - 带有 Rails + Apache/Passenger 和 MySql 的 Linux Mint

MySQL INSERT/SELECT 子查询语法

php - 我如何使用 MySQL Join 按最后回复对论坛主题进行排序?

php - 如何显示自定义字段值数组中的 Wordpress 帖子

mysql - 对 MySQL 表的字段进行排序

sql - 如何在 MySQL 中将 BLOB 转换为 TEXT?

Mysql数据库设计中的多对多关系

php - 如何克服这个错误? "Undefined index: name in C:\Program Files\EasyPHP-12.0\www\ipetlin\signup.php on line 118"