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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:36:00