如何编写SQL查询返回看过Alex至少75%电影的观众ID
解决方案:找出看过Alex至少75%观影作品的观众ID
没问题,我来帮你把现有的查询整合起来,实现目标需求。核心逻辑是先统计Alex的观影总数,再计算每个其他观众与Alex重叠的观影数量,最后筛选出重叠数达到Alex总数75%及以上的观众。
方法1:使用CTE(更清晰易读)
-- 先获取Alex看过的所有电影 WITH alex_movies AS ( SELECT movie_id FROM viewers_movies_rankings WHERE viewer_id = 313 ), -- 统计Alex的观影总数 alex_total AS ( SELECT COUNT(*) AS total_movies FROM alex_movies ) -- 关联其他观众与Alex的电影,统计重叠数并筛选 SELECT other.viewer_id FROM viewers_movies_rankings other JOIN alex_movies am ON other.movie_id = am.movie_id WHERE other.viewer_id != 313 GROUP BY other.viewer_id -- 筛选条件:重叠数 >= Alex总数的75% HAVING COUNT(DISTINCT other.movie_id) >= (SELECT total_movies * 0.75 FROM alex_total);
方法2:使用嵌套子查询(兼容性更强)
如果你的数据库不支持CTE(比如一些旧版本的MySQL),可以用这种写法:
SELECT other.viewer_id FROM viewers_movies_rankings other -- 关联Alex看过的电影 JOIN (SELECT movie_id FROM viewers_movies_rankings WHERE viewer_id = 313) am ON other.movie_id = am.movie_id WHERE other.viewer_id != 313 GROUP BY other.viewer_id -- 直接计算Alex总数的75%作为阈值 HAVING COUNT(DISTINCT other.movie_id) >= (SELECT COUNT(*) * 0.75 FROM viewers_movies_rankings WHERE viewer_id = 313);
关键步骤解释
- 获取Alex的电影列表:通过子查询或CTE提取Alex(viewer_id=313)看过的所有
movie_id,避免重复查询。 - 统计Alex的观影总数:单独计算这个数值,作为后续判断75%阈值的基准。
- 关联并分组统计:将其他观众的观影记录与Alex的电影列表关联,然后按
viewer_id分组,统计每个观众与Alex重叠的电影数量。- 这里用
COUNT(DISTINCT other.movie_id)是为了避免同一观众多次观看同一部电影时重复计数,如果你的表中每个观众每部电影只有一条记录,可以简化为COUNT(*)。
- 这里用
- 筛选符合条件的观众:用
HAVING子句(而非WHERE,因为涉及聚合函数)判断重叠数是否达到Alex总数的75%。
你之前的查询问题所在
你之前的查询只是把Alex和其他观众的共同电影记录列了出来,但没有按观众分组统计数量,也没有和Alex的总数做阈值对比。加上GROUP BY other.viewer_id和HAVING条件后,就能完成最终的筛选逻辑了。
内容的提问来源于stack exchange,提问作者genericname
相关产品推荐
相关产品推荐

