基于影视系列筛选相似影片的SQL查询合理性咨询
影片同系列相似影片查询SQL的合理性分析
表结构与数据
现有movies_franchises表的结构及数据如下:
| id | movie_id | franchise_id |
|---|---|---|
| 1 | 23 | 15 |
| 1 | 24 | 15 |
| 1 | 25 | 15 |
| 1 | 26 | 16 |
| 1 | 23 | 16 |
需求说明:一部影片可关联多个影视系列(franchise_id),需要获取与指定影片(例如movie_id=23)同系列的所有相似影片,预期返回结果为24、25、26。
用户当前使用的SQL语句:
SELECT DISTINCT movie_id FROM movies_franchises WHERE franchise_id IN (SELECT franchise_id FROM movies_franchises WHERE movie_id = 23) AND movie_id != 23
合理性分析
这个写法完全合理,能精准满足需求,具体原因:
- 子查询先定位出指定影片(movie_id=23)所属的所有系列ID(此处为15和16),主查询再筛选这些系列下的所有影片ID,同时排除指定影片本身,逻辑直接清晰
- 加上
DISTINCT可以避免同一影片因关联多个系列而重复返回,比如若某影片同时属于15和16系列,不会多次出现在结果里 - 语句简单易懂,对于中小数据量的表来说,性能表现足够
如果你的表数据量较大,想要优化性能,也可以改用JOIN写法,部分数据库的优化器对JOIN的执行计划会更友好,示例如下:
SELECT DISTINCT mf2.movie_id FROM movies_franchises mf1 JOIN movies_franchises mf2 ON mf1.franchise_id = mf2.franchise_id WHERE mf1.movie_id = 23 AND mf2.movie_id != 23
两种写法都能达成目标,具体选择可以根据实际数据规模和数据库的执行效率来决定。
内容的提问来源于stack exchange,提问作者Bobby Redjeans
相关产品推荐
相关产品推荐

