mysql - mysql 中的 In 子句

标签 mysql sql

我有如下 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...对于其他情况,使用 JOINEXISTS。这不仅更干净,而且还可能会产生性能更好的执行计划。

关于mysql - mysql 中的 In 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268444/

相关文章:

python - 如何计算给定日期的 SQL 表中列的总和,并用最接近的前一个日期修补缺失值?

php - 打印结果以查看多页结果

php - 将带有 URL 变量的超链接添加到数据表(jQuery)+搜索不起作用

php - 准备好的语句未在锁定下执行

java - 如何在 Java 中使用 select 语句和连接表填充 jComboBox

mysql - 查询sql在同一个表中选择两次

MySQL 左连接

MySQL While 循环用增量值填充表,其中没有自动增量选项

Java SQLite : exploiting a ResultSet for a COUNT query

php - SQL 每周结果表结构