MySQL - 包含Null Rows的电影数据库查询

时间:2014-07-31 21:24:53

标签: mysql sql

作为参考,我正在研究这里概述的Sakila租赁DVD数据库(#2):http://www.ntu.edu.sg/home/ehchua/programming/sql/SampleDatabases.html

我试图找到每位演员所有科幻电影的运行时间,包括那些没有参加科幻电影的人。我对那些曾经在科幻电影中的人有正确的查询,但是我很难扩展它以包括所有演员,即使运行时为NULL。

这是我的问题:

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

这让我看到了至少有1部科幻电影的167名演员。我认为我的WHERE子句不允许NULL行,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:0)

你是对的,where子句正在左边连接的最右边...如果它为null它将被过滤掉,因为null不等于' Sci-Fi& #39 ;.想要空?告诉where语句包含它们

 WHERE (cat.name = 'Sci-Fi' or cat.name is null)

答案 1 :(得分:0)

您应该将“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