MySQL-包含空行的电影数据库查询

MySQL-包含空行的电影数据库查询,mysql,sql,Mysql,Sql,作为参考,我正在制作Sakila租赁DVD数据库,概述如下(#2): 我试图找到每个演员都看过的所有科幻电影的运行时间,包括那些没有看过科幻电影的演员。对于那些看过科幻电影的人,我有一个正确的查询,但是我很难将它扩展到包括所有演员,即使运行时为空 我的问题是: SELECT act.first_name, act.last_name, SUM(fm.length) FROM film fm INNER JOIN film_actor fa ON fa.film_id = fm.film_id I

作为参考,我正在制作Sakila租赁DVD数据库,概述如下(#2):

我试图找到每个演员都看过的所有科幻电影的运行时间,包括那些没有看过科幻电影的演员。对于那些看过科幻电影的人,我有一个正确的查询,但是我很难将它扩展到包括所有演员,即使运行时为空

我的问题是:

SELECT act.first_name, act.last_name, SUM(fm.length)
FROM film fm
INNER JOIN film_actor fa ON fa.film_id = fm.film_id
INNER JOIN actor act ON fa.actor_id = act.actor_id
LEFT JOIN film_category fc ON fm.film_id = fc.film_id
LEFT JOIN category cat ON fc.category_id = cat.category_id
WHERE cat.name = 'Sci-Fi'
GROUP BY act.first_name, act.last_name
ORDER BY act.last_name ASC

这让我了解了所有167名演员,他们至少参与了一部科幻电影。我认为WHERE子句不允许空行,但我不知道如何修复它

你是对的,where子句在左连接的最右侧起作用……如果它为null,它将被过滤掉,因为null不等于“Sci Fi”。想要空值吗?告诉where语句包含它们

 WHERE (cat.name = 'Sci-Fi' or cat.name is null)
在外部连接中,应该将“cat.name='Sci Fi'作为ON子句的一部分

除非您的条件筛选为空,否则决不能将涉及外部联接表的条件放在WHERE子句中,因为它会将外部联接转换为内部联接。这些条件属于on子句

SELECT act.first_name, act.last_name, SUM(fm.length)
  FROM film fm
 INNER JOIN film_actor fa
    ON fa.film_id = fm.film_id
 INNER JOIN actor act
    ON fa.actor_id = act.actor_id
  LEFT JOIN film_category fc
    ON fm.film_id = fc.film_id
  LEFT JOIN category cat
    ON fc.category_id = cat.category_id
   and cat.name = 'Sci-Fi'
 GROUP BY act.first_name, act.last_name
 ORDER BY act.last_name ASC

我的错误,在我的查询中修复了,但在帖子中没有。编辑了帖子。为什么你有
film_category
category
?即使你很清楚,如果其他人在你之后处理代码,这可能会让人困惑。如果你真的需要这两个,我会将后者重命名为
X_category
,其中X才是真正的含义表示。我没有创建数据库。我同意这有点混乱。film_category包含film_id和category_id。category将category_id与category name连接起来。因此,要获取film name及其category,需要所有三个表。啊,对,film_category是一个多对多表。好的,这很有意义。