如何使用WHERE子句显示空结果

时间:2016-07-19 23:19:50

标签: mysql sql

嘿伙计们我是SQL的新手并且有些困难。我希望有人可以为我清理一些东西。

这是我的问题。我想要显示演员演奏的所有类别以及他们在该类别中播放的电影数量。例如,他们已经在动作片中播放了5次。这就是我到目前为止所做的:

SELECT c.name AS "Category_Name"
      , Count(c.name) AS "Count"
  FROM category c
  JOIN  film_category fc 
    ON c.category_id = fc.category_id
  JOIN film f 
    ON fc.film_id = f.film_id
  JOIN film_actor fa 
    ON f.film_id = fa.film_id 
  JOIN actor a 
    ON fa.actor_id = a.actor_id
WHERE a.first_name = "Kevin" 
   AND a.last_name = "Bloom"
 GROUP 
    BY c.name
ORDER 
    BY c.name ASC;

这将显示所有类别和“Kevin Bloom”在每个类别中播放的次数,但是它不会显示未播放的类别的NULL值,我需要它。我花了几个小时试图解决这个问题,但它要么没有帮助,要么我无法理解它。

从我收集的WHERE子句导致此问题。我也相信我可能需要使用LEFT JOIN而可能需要使用子查询。当结合使用时,我对这两件事情都有点不稳定。如果有人能为第一次学习者提供一些帮助,我会非常感激!

2 个答案:

答案 0 :(得分:1)

SELECT c.name AS "Category_Name", Count(a.actor_id) AS "Count"
FROM category c
    LEFT JOIN  film_category fc ON c.category_id = fc.category_id
    LEFT JOIN film f ON fc.film_id = f.film_id
    LEFT JOIN film_actor fa ON f.film_id = fa.film_id 
    LEFT JOIN actor a
       ON fa.actor_id = a.actor_id
       AND a.first_name = 'Kevin' AND a.last_name = 'Bloom'
GROUP BY c.name
ORDER BY c.name ASC;

根据您的评论,使用ANDWHERE的原因是关于在执行时如何评估WHEREWHERE子句根据您指定的条件限制整个结果集。而ON条件仅限制允许匹配记录的内容,而不一定限制使用OUTER JOIN时的整个结果集。因此,如果您将WHERE条件置于该限制条件中,则基于RIGHT LEFT JOIN的{​​{1}}方面的结果变为INNER JOIN,因为它告诉SQL您只希望结果为匹配,因为只有一些categories匹配actor,您只能获得这些类别。但是,通过将条件放在ON的{​​{1}}子句中,您的结果不会受到限制,并且将返回所有类别,但只会考虑符合您条件的参与者。

答案 1 :(得分:0)

你会使用LEFT JOIN,但你必须小心:

  SELECT c.name AS Category_Name, Count(a.actor_id) AS "Count"
  FROM category c LEFT JOIN
       film_category fc 
       ON c.category_id = fc.category_id LEFT JOIN
       film f 
       ON fc.film_id = f.film_id LEFT JOIN
       film_actor fa 
       ON f.film_id = fa.film_id LEFT JOIN
       actor a 
       ON fa.actor_id = a.actor_id AND a.first_name = 'Kevin' AND a.last_name = 'Bloom'
  GROUP BY c.name
  ORDER BY c.name ASC;

注意:

  • LEFT JOIN是解决方案的关键。
  • 请注意,COUNT()已更改为从actor计算ID。对于尚未采取行动的类别,这将返回0
  • SQL中字符串的标准分隔符是单引号,而不是双引号。
  • 除非必要,否则无需转义列别名。