如何不使用CTE或子查询实现演员年参演电影数统计
无需CTE/子查询的高效实现方案
你不需要额外嵌套CTE或者子查询完成这个统计,直接在两表关联的结果集上做分组聚合即可,相比你原来的写法减少了一层中间结果集的生成开销,执行效率更高。
涉及表结构
actor表:字段为actor_id、first_name、last_name、last_updatefilm_actor表:字段为actor_id、film_id、last_update
可直接运行的SQL代码
SELECT CONCAT(a.first_name, ' ', a.last_name) AS Actor_name, COUNT(fa.film_id) AS Number_of_films, EXTRACT(YEAR FROM a.last_update) AS `Year` FROM sakila.actor a LEFT JOIN sakila.film_actor fa ON a.actor_id = fa.actor_id GROUP BY Actor_name, `Year` ORDER BY Actor_name ASC;
写法说明
- 给表起简短别名(
a代指actor表、fa代指film_actor表)简化语句长度,提升可读性 - 关联逻辑和你原有写法完全一致,直接把姓名拼接、年份提取的计算逻辑下推到聚合层,跳过中间临时表的构建步骤,MySQL优化器可以直接生成「关联+聚合」的最优执行计划
逻辑提示:你原有写法中取年份用的是actor表的
last_update字段,该字段记录的是演员基础信息的最后更新时间,并非参演对应电影的关联时间。如果你的实际需求是统计演员每年参演电影的数量(按参演关系建立年份计算),需要把年份提取逻辑替换为EXTRACT(YEAR FROM fa.last_update),结果才符合业务预期。
内容的提问来源于stack exchange,提问作者prayag purohit
相关产品推荐
相关产品推荐

