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

如何在MySQL中查询两位用户共同看过的电影及各自评分?

查找两位用户共同看过的电影及各自评分的MySQL方案

没问题,这是个非常典型的用户观影交集查询场景,我会给你清晰的解决方案,完全适配你提到的三张表结构。

核心思路

要实现这个需求,我们需要:

  1. 筛选出两位指定用户都有评分记录(即都看过)的电影ID;
  2. 关联Movies表获取这些电影的详细信息;
  3. 分别关联两位用户的Ratings记录,提取各自的评分。

直接可用的查询语句

假设你的三张表结构如下(符合常规设计):

  • Users: user_id(主键)、username等用户字段;
  • Movies: movie_id(主键)、title、release_year等电影字段;
  • Ratings: user_id、movie_id(联合主键)、rating评分字段。

针对指定用户A=1、用户B=2的查询语句如下:

SELECT
    m.movie_id,
    m.title,
    m.release_year, -- 按需添加其他电影字段
    r1.user_id AS user_a_id,
    r1.rating AS user_a_rating,
    r2.user_id AS user_b_id,
    r2.rating AS user_b_rating
FROM
    Movies m
-- 先关联用户1的评分记录,过滤出用户1看过的电影
INNER JOIN Ratings r1 
    ON m.movie_id = r1.movie_id 
    AND r1.user_id = 1
-- 再关联用户2的评分记录,进一步过滤出两人都看过的电影
INNER JOIN Ratings r2 
    ON m.movie_id = r2.movie_id 
    AND r2.user_id = 2;

语句解释

  • INNER JOIN 过滤逻辑:两次内连接Ratings表,第一次只保留用户1评分过的电影,第二次只保留用户2也评分过的电影,最终得到的就是两位用户共同看过的电影集合;
  • 字段选择:通过别名r1、r2分别区分两位用户的评分记录,把需要展示的电影信息和评分字段明确列出;
  • 性能优势:在JOIN条件里直接指定用户ID,比先全量关联再WHERE过滤更高效,因为它会提前缩小数据集。

灵活调整建议

  • 如果需要动态指定用户(比如在应用中接收用户输入),不要硬编码用户ID,改用参数绑定(比如Java的PreparedStatement、Python的SQLAlchemy参数化查询),避免SQL注入风险;
  • 如果要扩展到更多用户的共同电影,只需继续添加对应的INNER JOIN Ratings rn ON m.movie_id = rn.movie_id AND rn.user_id = N即可;
  • 如果需要处理用户可能未评分的边缘情况(但你的需求是“都看过”,所以不需要),可以改用LEFT JOIN并添加WHERE rn.rating IS NOT NULL来过滤。

符合预期的结果

针对你提到的示例数据,这个查询会返回两条记录:

  • 第一条是《闪灵》的信息,加上用户1和用户2的ID及各自评分;
  • 第二条是《星际穿越》的信息,加上两位用户的ID及评分;
    其他只有单个用户看过的电影会被自动排除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:00