MySQL多表联合查询:匹配名称并按movie_id去重实现方法
解决方案
要实现同时匹配两张表的名称字段,且每个电影仅返回一条结果,你可以根据使用的数据库选择以下方案:
方案1:通用窗口函数法(支持MySQL 8+、PostgreSQL、SQL Server等)
兼容性强,且能灵活控制返回哪一条细节记录:
WITH filtered_records AS ( SELECT -- 统一处理有/无详情的电影ID COALESCE(md.movie_id, m.id) AS movie_id, m.movie_name, md.name AS detail_name, md.description, md.trailer, md.category, md.tags, md.studio, md.release_date, -- 按电影ID分组,给每条记录编号 ROW_NUMBER() OVER ( PARTITION BY COALESCE(md.movie_id, m.id) ORDER BY md.release_date DESC -- 可修改排序规则,比如md.id取第一条创建的详情 ) AS row_num FROM movies m -- LEFT JOIN确保匹配到没有详情记录但名称符合的电影 LEFT JOIN movie_details md ON m.id = md.movie_id -- 匹配条件:详情名称或电影名称包含关键词 WHERE (md.name LIKE '%你的搜索关键词%' OR m.movie_name LIKE '%你的搜索关键词%') ) -- 只保留每个电影的第一条记录 SELECT movie_id, movie_name, detail_name, description, trailer, category, tags, studio, release_date FROM filtered_records WHERE row_num = 1;
方案2:MySQL GROUP BY 简化法(适用于MySQL 5.7+)
如果你的MySQL关闭了ONLY_FULL_GROUP_BY,可以直接按电影ID分组:
SELECT md.movie_id, m.movie_name, md.name AS detail_name, md.description, md.trailer, md.category, md.tags, md.studio, md.release_date FROM movie_details md JOIN movies m ON md.movie_id = m.id WHERE md.name LIKE '%你的搜索关键词%' OR m.movie_name LIKE '%你的搜索关键词%' GROUP BY md.movie_id;
若开启了ONLY_FULL_GROUP_BY,需用聚合函数指定取哪条详情:
SELECT md.movie_id, MAX(m.movie_name) AS movie_name, MAX(md.name) AS detail_name, MAX(md.description) AS description, MAX(md.trailer) AS trailer, MAX(md.category) AS category, MAX(md.tags) AS tags, MAX(md.studio) AS studio, MAX(md.release_date) AS release_date FROM movie_details md JOIN movies m ON md.movie_id = m.id WHERE md.name LIKE '%你的搜索关键词%' OR m.movie_name LIKE '%你的搜索关键词%' GROUP BY md.movie_id;
补充:
如果需要包含无详情记录的电影,把JOIN改成LEFT JOIN即可。
方案3:PostgreSQL DISTINCT ON 语法
PostgreSQL支持更简洁的去重语法:
SELECT DISTINCT ON (COALESCE(md.movie_id, m.id)) COALESCE(md.movie_id, m.id) AS movie_id, m.movie_name, md.name AS detail_name, md.description, md.trailer, md.category, md.tags, md.studio, md.release_date FROM movies m LEFT JOIN movie_details md ON m.id = md.movie_id WHERE (md.name LIKE '%你的搜索关键词%' OR m.movie_name LIKE '%你的搜索关键词%') ORDER BY COALESCE(md.movie_id, m.id), md.release_date DESC;
说明:
DISTINCT ON (column) 会保留每个分组的第一条记录,必须在ORDER BY中先指定分组字段,再指定排序规则。
内容的提问来源于stack exchange,提问作者frederik
相关产品推荐
相关产品推荐

