嘿伙计们我是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而可能需要使用子查询。当结合使用时,我对这两件事情都有点不稳定。如果有人能为第一次学习者提供一些帮助,我会非常感激!
答案 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;
根据您的评论,使用AND
与WHERE
的原因是关于在执行时如何评估WHERE
。 WHERE
子句根据您指定的条件限制整个结果集。而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
。