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

如何编写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);

关键步骤解释

  1. 获取Alex的电影列表:通过子查询或CTE提取Alex(viewer_id=313)看过的所有movie_id,避免重复查询。
  2. 统计Alex的观影总数:单独计算这个数值,作为后续判断75%阈值的基准。
  3. 关联并分组统计:将其他观众的观影记录与Alex的电影列表关联,然后按viewer_id分组,统计每个观众与Alex重叠的电影数量。
    • 这里用COUNT(DISTINCT other.movie_id)是为了避免同一观众多次观看同一部电影时重复计数,如果你的表中每个观众每部电影只有一条记录,可以简化为COUNT(*)。
  4. 筛选符合条件的观众:用HAVING子句(而非WHERE,因为涉及聚合函数)判断重叠数是否达到Alex总数的75%。

你之前的查询问题所在

你之前的查询只是把Alex和其他观众的共同电影记录列了出来,但没有按观众分组统计数量,也没有和Alex的总数做阈值对比。加上GROUP BY other.viewer_id和HAVING条件后,就能完成最终的筛选逻辑了。

内容的提问来源于stack exchange,提问作者genericname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:18:30