在SQL筛选时计数包括0

3
以下是我的代码。它返回一个人在电影中出现的每个类别的计数。它会返回结果,但我希望它列出所有类别,包括计数为0的那些。我尝试了LEFT JOIN、OUTER JOIN等所有组合,但仍然无法实现。任何帮助都将不胜感激!
SELECT c.name, COUNT(f.title) FROM category c
LEFT JOIN film_category fc ON c.category_id = fc.category_id
INNER JOIN film f ON fc.film_id = f.film_id
INNER JOIN film_actor fa ON f.film_id = fa.film_id
INNER JOIN actor a ON fa.actor_id = a.actor_id
WHERE a.first_name = 'Jack' AND a.last_name = 'Daniel'
GROUP BY c.name ASC;

也许使用 ...sum(if(name is null, 1, 1))... 而不是 count 可能会起作用。 - geoB
我知道你的模式设置和查询看起来非常复杂,但这基本上是在典型的ER模型中想要选择0项类别的任何人都会面临的相同问题。所以答案就在这里:http://stackoverflow.com/questions/12177444/sql-query-to-get-empty-categories-too。我认为你需要将第一个INNER JOIN更改为LEFT JOIN,但对于我来说,这需要进行大量设置和测试。 - braks
将所有的“内连接”更改为“左连接”,并将您的“where”条件移至连接中... - sgeddes
2个回答

1
尝试这个。

SQL Fiddle演示


SELECT c.name, COUNT(f.title) 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 = 'Jack' AND a.last_name = 'Daniel'
WHERE 1=1 
GROUP BY c.name ASC;

1
正是“WHERE”子句让Solomon感到困扰——它自动过滤掉了“不匹配”的行。通过将名称选择器移动到连接条件中,数据库能够返回所有类别行,无论是否匹配。干得好! - Curt
1
除非已经声明了film.title NOT NULL,否则你应该使用COUNT(f.film_id)来避免计数中漏掉标题为null的电影。 - Michael - sqlbot
嗨@Solomon,如果这个或任何答案解决了您的问题,请考虑通过点击复选标记接受它。这向更广泛的社区表明您已找到解决方案,并为回答者和您自己赢得了一些声誉。没有义务这样做。 - WorkSmarter

-1

联合您查询的反向条件,例如

SELECT c.name, COUNT(f.ti....
...

UNION 

SELECT c.name, 0
FROM category c
...
WHERE NOT(a.first_name = 'Jack' AND a.last_name = 'Daniel')
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接