mysql - 左连接不返回左表中的所有行

标签 mysql

我有一个电影数据库,其中一个表是“类别”,其中包含数据库中电影可能具有的所有类型。

运行以下查询:

SELECT category.name FROM category 

返回行:

Action
Animation
Children
Classics
Comedy
Documentary
Drama
Family
Foreign
Games
Horror
Music
New
Sci-Fi
Sports
Travel

我正在尝试查询数据库以查找特定 Actor 所扮演角色的每个特定流派的 #,但我希望它返回下一列中带有 # 的所有流派。这是我最初的查询:

SELECT q1.name AS 'Film Category', COUNT(q2.name) AS '# of Films Ed Chase has appeared in' 
FROM (
    SELECT category.name FROM category 
) AS q1
LEFT JOIN (
    SELECT category.name FROM category 
    INNER JOIN film_category ON film_category.category_id = category.category_id
    INNER JOIN film ON film.film_id = film_category.film_id
    INNER JOIN film_actor ON film.film_id = film_actor.film_id
    INNER JOIN actor ON actor.actor_id = film_actor.actor_id
    WHERE actor.first_name = 'ED' AND actor.last_name = 'CHASE'
) AS q2
ON q1.name = q2.name AND '# of Films Ed Chase has starred in' >= 0
GROUP BY q2.name
ORDER BY q2.name;

它返回这个表,缺少一些行(我希望它给出所有类型,而不仅仅是 Actor 扮演的角色):

Film Category   # of Films Ed Chase has appeared in
Animation       0
Action          2
Classics        2
Documentary     6
Drama           3
Foreign         2
Music           1
New             2
Sci-Fi          1
Sports          2
Travel          1

有趣的是,它为“动画”返回“0”,但没有为“ child ”或“喜剧”行,这是我正在寻找的结果(返回所有类型)。我做错了什么?

最佳答案

COUNT() 不计算 NULL,并且您的左连接会将 NULL 放入右侧表中没有值的记录中。您的外部联接实际上(或应该 - 检查这一点)返回所有所需的行,但带有聚合函数的外部选择正在吞噬它们。

尝试将 count() 移至右侧子查询中,然后在外部查询中将其替换为 IFNULL(q2.count, '0') 以将 NULL 替换为零。

我会注意到,您应该根据 q1.name 进行分组,而不是 q2.name。

关于mysql - 左连接不返回左表中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579310/

相关文章:

mysql - 将 MySQL 数据库导入 SQL Server

php - 选择和浏览存储在单独表中的类别和子类别

mysql - 从两个表中选择返回空值

PHP 比较登录详细信息

mysql - 更新具有重复值的行(在同一列中)

c# - 使用 "as"关键字的表别名是否会影响数据类型?

php - 更新 mysql 表时出现 ServerError 500

php - Mysql Join 两个表获取相关数据

php - COMMIT 后无法执行任何 MySQL 查询

php - 从数据库接收变量的最佳方式