我有如下 4 个表,它们具有以下属性:
Actor:actor_id,firstname,lastname
film_actor:actor_id,film_id
film_category:film_id,category_id
category:category_id,name
我想查找所有电影 Actor 的列表、他们的 film_id、category_id 和类别名称。
我想使用In子句进行fol查询。所以我通过如下实现来获得o/p:
select a.first_name,a.actor_id,fc.film_id,c.name,c.category_id
from actor a,film_actor fa,film_category fc,category c where a.actor_id
in (select fa.film_id from film_actor fa where fa.actor_id=a.actor_id
and fa.film_id
in (select fc.film_id from film_category fc where fc.film_id=fa.film_id
and fc.category_id
in(select fc.category_id from category c where c.category_id=fc.category_id)))
但是假设现在我想知道特定category_id的 Actor 列表。假设5 这是存在的。所以我做了以下更改:
select a.first_name,a.actor_id,fc.film_id,c.name,c.category_id
from actor a,film_actor fa,film_category fc,category c
where a.actor_id in
(select fa.film_id from film_actor fa where fa.actor_id=a.actor_id
and fa.film_id
in (select fc.film_id from film_category fc where fc.film_id=fa.film_id
and fc.category_id
in(select fc.category_id from category c where c.category_id=fc.category_id
and category_id=5)))
我得到的结果为空。最后,我们什么时候应该使用 IN 子句,什么时候不应该使用?
最佳答案
不要使用 IN
来实现此目的。请使用 JOIN
来代替。
select
a.first_name,
a.actor_id,
fc.film_id,
c.name,
c.category_id
from
actor a join
film_actor fa on fa.actor_id = a.actor_id join
film_category fc on fc.film_id = fa.film_id join
category c on c.category_id = fc.category_id and c.category_id = 5
我通常只对硬编码的 ID 集使用 IN
...对于其他情况,使用 JOIN
或 EXISTS
。这不仅更干净,而且还可能会产生性能更好的执行计划。
关于mysql - mysql 中的 In 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268444/