You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 16:54:03