如何在MySQL中查询两位用户共同看过的电影及各自评分?
查找两位用户共同看过的电影及各自评分的MySQL方案
没问题,这是个非常典型的用户观影交集查询场景,我会给你清晰的解决方案,完全适配你提到的三张表结构。
核心思路
要实现这个需求,我们需要:
- 筛选出两位指定用户都有评分记录(即都看过)的电影ID;
- 关联
Movies表获取这些电影的详细信息; - 分别关联两位用户的
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
相关产品推荐
相关产品推荐

