如何通过多表联查与WHERE子句筛选符合用户偏好的电影数据
解决方法:查询符合用户偏好的电影
没问题,我帮你写一个精准匹配需求的MySQL查询,完全能得到你想要的结果。
思路解析
要筛选出至少有一位演员或一家制作公司在用户偏好列表中的电影,我们需要:
- 先找出所有符合条件的电影ID:要么该电影有演员在
user_cast_preference里,要么有制作公司在user_production_preference里 - 关联电影基础信息表,同时把同一电影的所有演员、制作公司合并成逗号分隔的字符串
- 按电影分组,确保每个电影只显示一行结果
完整SQL查询代码
SELECT gi.Movie_ID, gi.Movie_Name, GROUP_CONCAT(DISTINCT c.Cast_Name ORDER BY c.Cast_Name SEPARATOR ', ') AS cast_name, GROUP_CONCAT(DISTINCT pc.Production_name ORDER BY pc.Production_name SEPARATOR ', ') AS production_name FROM general_info gi JOIN ( -- 获取有演员在用户偏好里的电影ID (SELECT DISTINCT c.Movie_ID FROM cast c JOIN user_cast_preference ucp ON c.Cast_Name = ucp.user_cast_name WHERE ucp.user_id = 1) UNION -- 获取有制作公司在用户偏好里的电影ID (SELECT DISTINCT pc.Movie_ID FROM production_companies pc JOIN user_production_preference upp ON pc.Production_name = upp.user_production_name WHERE upp.user_id = 1) ) eligible_movies ON gi.Movie_ID = eligible_movies.Movie_ID LEFT JOIN cast c ON gi.Movie_ID = c.Movie_ID LEFT JOIN production_companies pc ON gi.Movie_ID = pc.Movie_ID GROUP BY gi.Movie_ID, gi.Movie_Name ORDER BY gi.Movie_ID;
代码说明
- 子查询
eligible_movies:用UNION合并两类符合条件的电影ID,自动去重,避免同一电影被多次筛选 GROUP_CONCAT:把同一电影的多个演员/制作公司合并成逗号分隔的字符串,DISTINCT防止重复数据,ORDER BY让结果更规整LEFT JOIN:确保能获取到该电影的所有演员和制作公司,不管他们是否在用户偏好里(毕竟需求是只要有一个符合就入选,而展示所有相关信息)GROUP BY:按电影ID和名称分组,保证每个电影只输出一行结果
执行这个查询后,你会得到和预期完全一致的结果:只返回Iron Man和Batman,Superman因为演员和制作公司都不在用户偏好列表里,会被排除在外。
内容的提问来源于stack exchange,提问作者Josh Poor
相关产品推荐
相关产品推荐

