基于Sakila数据库,使用MySQL CASE语句按记录计数实现演员分级
调整后的MySQL查询语句
针对你的需求,修改后的查询会先预计算每个演员的参演电影数量,再通过区间判断生成等级,同时避免原查询的重复计算问题:
SELECT a.*, fa_count.film_count, CASE WHEN fa_count.film_count BETWEEN 0 AND 20 THEN 'Newcomer' WHEN fa_count.film_count BETWEEN 21 AND 30 THEN 'Prolific Actor' WHEN fa_count.film_count > 30 THEN 'Hollywood Star' END AS actor_level FROM sakila.actor a JOIN ( -- 预计算每个演员的参演电影总数 SELECT actor_id, COUNT(*) AS film_count FROM sakila.film_actor GROUP BY actor_id ) fa_count ON a.actor_id = fa_count.actor_id
关键调整点:
- 用子查询预统计参演数:原代码中每行都执行一次
count(*)子查询,效率较低,这里通过GROUP BY只计算一次所有演员的参演数 - 改用搜索式CASE:原代码的简单CASE只能匹配固定值,搜索式CASE支持区间判断,更适合你的分级规则
- 修正区间逻辑:明确划分无重叠的区间(0-20、21-30、31+),避免原规则中30的重复匹配问题
可选扩展:
如果需要展示从未参演任何电影的演员(即film_actor中无记录的演员),可以将JOIN改为LEFT JOIN,此时这类演员的film_count会显示为NULL,可以在CASE中补充WHEN fa_count.film_count IS NULL THEN 'Newcomer'来统一处理。
内容的提问来源于stack exchange,提问作者Qoi VamBorg
相关产品推荐
相关产品推荐

