MySQL如何查询显示所有演员及其参演X影片的数量
问题根源
当前查询丢失所有无X类影片参演记录的演员数据,核心原因是过滤条件位置错误导致左外连接失效:
左外连接ACTOR LEFT JOIN ROLE的设计逻辑是保留ACTOR表全量行,哪怕和ROLE表没有匹配项也会返回对应演员记录。但写在WHERE子句里的R_ROLE LIKE '%(X)%',会把左连接生成的、R_ROLE为NULL(无匹配记录)的行全部过滤掉——因为NULL参与LIKE判断的结果不为真,最终查询会退化成内连接,只返回有X类影片参演记录的演员。
修正方法
把针对ROLE表的X标识过滤条件,从WHERE子句移动到左连接的ON匹配条件中:
在连接阶段就先筛出ROLE表里符合R_ROLE LIKE '%(X)%'的记录,再和ACTOR表做左连接。没有匹配记录的演员,对应的ROLE字段会保留NULL值,COUNT(R_ROLE)统计时会自动跳过NULL值,刚好返回0的计数,同时完整保留所有录入的演员信息。
修正后的可执行SQL:
SELECT A_FNAME, A_LNAME, COUNT(R_ROLE) AS "X FILMS" FROM ACTOR LEFT OUTER JOIN ROLE ON ACTOR.A_ID = ROLE.A_ID AND R_ROLE LIKE '%(X)%' GROUP BY A_ID, A_FNAME, A_LNAME;
细节优化说明
- 原查询里的
SELECT ALL属于冗余写法,SQL默认查询就是返回全部符合条件的行,无需额外声明 - 原GROUP BY仅按姓、名字段分组存在风险:如果存在同名的不同演员,会被错误合并统计,加上演员唯一标识
A_ID可以避免这类数据错误 - 如果后续需要关联MOVIE表校验带X标识的影片属性,同样要把针对MOVIE表的过滤条件放在对应LEFT JOIN的ON子句中,不要写在WHERE里,否则会再次出现左连接失效的问题
内容的提问来源于stack exchange,提问作者iceyxx
相关产品推荐
相关产品推荐

