【问题标题】:How to include Null values in Join如何在 Join 中包含 Null 值
【发布时间】:2021-12-27 02:49:58
【问题描述】:

我正在执行一项任务,该任务需要我生成一个显示名称、年份和演员编号的电影列表,其中标题中包含“JEDI”一词。如果电影中有演员 3,则在演员编号列中仅显示演员编号 3,否则显示 null。按片名排序。

我目前的代码如下:

select film_actor.film_id, title, actor_id from film_actor
left join film
on film.film_id = film_actor.film_id
where actor_id in (select actor_id from film_actor where actor_id = "3")
and title like "%JEDI%"
group by film_id
order by title

这仅输出与 actor_id = "3" 匹配的结果,但它不显示标题中有 "JEDI" 但 actor_id 不是 3 的两部电影。 This image shows the desired result on the right, and my result on the left

我可以在我的代码中进行哪些更改以获得所需的结果?

非常感谢!

【问题讨论】:

  • 由于您将film 加入到film_actor,您将从film_actorNULL 获得所有可能的结果,如果没有相应的film演员。您要么正在寻找 RIGHT 连接,要么想要在查询中切换这两个表

标签: mysql sql data-modeling


【解决方案1】:

您需要将film 设为父表,将actor 设为您离开加入的表,因为那可能没有匹配的元素(您也可以使用RIGHT JOIN,但这不太常见) .

然后您需要将actor 表的条件放入ON 条件中,而不是WHERE

SELECT film.film_id, film.title, film_actor.actor_id
FROM film
LEFT JOIN film_actor
ON film.film_id = film_actor.film_id AND film_actor.actor_id = 3
WHERE title LIKE '%JEDI%'
ORDER BY title

这里不需要GROUP BY

【讨论】:

    【解决方案2】:

    为了你的目的,你的左连接是向后的,因为你想要所有匹配的电影,但只有演员有一个:

    select film.film_id, title, actor_id
    from film
    left join film on film.film_id = film_actor.film_id and film_actor.actor_id = "3"
    where title like "%JEDI%"
    order by title
    

    如果每部电影最多有一个actor_id 3,则不需要分组

    【讨论】:

    • 固定列选择具有始终存在的电影ID
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多