我正在关注一本书,它指出如果我们想为 Cate MacQueen 和 Cuba Birch 都出现的电影展示一张表格,我应该运行以下命令:
select f.release_year, f.title, concat(a1.first_name," ", a1.last_name)
from film f
inner join film_actor fa1
on f.film_id=fa1.film_id
inner join actor a1
on fa1.actor_id=a1.actor_id
inner join film_actor fa2
on f.film_id=fa2.film_id
inner join actor a2
on fa2.actor_id=a2.actor_id
where ((a1.first_name="CATE" and a1.last_name="mcqueen")
and (a2.first_name="cuba" and a2.last_name="BiRcH"));
我的问题是为什么需要第二个内部加入 film_actor fa2 ?为什么我们不能做
select f.release_year, f.title, concat(a1.first_name," ", a1.last_name)
from film f
inner join film_actor fa1
on f.film_id=fa1.film_id
inner join actor a1
on fa1.actor_id=a1.actor_id
inner join actor a2
on fa1.actor_id=a2.actor_id
where ((a1.first_name="CATE" and a1.last_name="mcqueen")
and (a2.first_name="cuba" and a2.last_name="BiRcH"));
?
我尝试了我的方法,但它只是返回一个空集,而不是像书中那样的 2 行表。
在第一种情况下,您会得到每部电影的所有演员对的组合。试试这个查询:
在第二种情况下,您只需加入相同的演员详细信息两次:
因此,没有与您的 where 条件相对应的行(a1.first_name="CATE" 和 a2.first_name="cuba")
附加说明:
SELECT * FROM film
-您获得电影列表(每部电影一行)SELECT * FROM film f JOIN film_actor fa1 ON f.film_id = fa1.film_id
-您获得电影演员列表(每部电影多行,每行包含一个演员 ID)SELECT * FROM film f JOIN film_actor fa1 ON f.film_id = fa1.film_id JOIN actor a1 ON fa1.actor_id=a1.actor_id
-您获得与上述相同的行,但带有每个演员的附加细节(每行仍然只与一个演员相关,没有成对的演员)SELECT * FROM film f JOIN film_actor fa1 ON f.film_id = fa1.film_id JOIN actor a1 ON fa1.actor_id=a1.actor_id JOIN actor a2 ON fa1.actor_id=a2.actor_id
- 与上面相同的结果,你只是为同一个演员加入了相同的细节两次第一次加入后,您将获得电影的演员名单。在第二次加入时,您将相同的演员列表添加到上述结果的每一行,并获取每部电影的所有演员对的列表(如上面的屏幕截图所示)