基于多个表的连接显示一个条件为真

Display that a condition is true based on the joining of multiple tables

背景:

我想展示所有与演员本·阿弗莱克合作过的人。

这是我的数据:

  People table
  
  id    name
 
  1     Ben Affleck
  2     Leonardio DiCaprio
  3     Matt Damon


  Movies table

  id   title
  1    Good Will Hunting
  2    example
  3    example


  Credits table
 
  id  movie_id person_id 
 
  1   1        1
  2   2        4
  3   3        6

期望输出

 name         movie
 
 Matt Damon   Good Will Hunting
 

这是我试过的:

我知道我必须将人物、电影和演职员表 table 加入到一起,因为我正试图找到与本·阿弗莱克合作过的所有演员:

 SELECT p.name, m.title, c.movie_id
 FROM Credits c
 JOIN People p ON p.id = c.person_id
 JOIN Movies m ON m.id = p.id
 WHERE p.name = 'Ben Affleck';

我还在研究这个。

你可以使用 exists:

select p.name, m.title, c.movie_id
from people p
inner join credits c on c.person_id = p.id
inner join movies m on m.id = c.movie_id
where exists (
    select 1 
    from people p1
    inner join credits c1 on c1.person_id = p1.id
    where c1.movie_id = c.movie_id and p1.name = 'Ben Affleck'
)

或者您可以使用 IN,有时它比 EXISTS 更容易理解。您在初始查询中加入 Movies table 时也有错误,您必须比较来自 Movies 的电影 ID,即 id 和来自 Credits 的电影 ID这是 movie_id

SELECT p.name, m.title
FROM Credits c
JOIN People p ON p.id = c.person_id
JOIN Movies m ON m.id = c.movie_id
WHERE m.id IN (
  SELECT movie_id 
  FROM Credits c1
  JOIN People p1 on p1.id = c1.person_id
  WHERE p1.name = 'Ben Affleck'
)

您可以使用 IN 子句,但也不需要本·阿弗莱克出现

 SELECT 
    p.name, m.title, c.movie_id
FROM
    Credits c
        JOIN
    People p ON p.id = c.person_id
        JOIN
    Movies m ON m.id = p.id
WHERE
    m.id IN (SELECT 
            movie_id
        FROM
            credis
        WHERE
            person_id IN (SELECT 
                    id
                FROM
                    People
                WHERE
                    name = 'Ben Affleck'))
    AND p.name <> 'Ben Affleck'