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

多表关联查询结果存在重复,如何剔除冗余条目?

解决SQL查询重复条目问题的几种方案

看起来你的查询因为多表关联的一对多关系,导致同一个菜谱(recipe_id)对应了多条重复记录。下面给你几个实用的解决办法,帮你把结果从9条精简到6条:

1. 用DISTINCT直接去重(最简单的方案)

如果你的核心需求是获取符合条件的菜谱本身,而不是菜谱和配料的组合,只需要在SELECT后加上DISTINCT,并明确只选择RecipeTable的字段(避免其他表字段导致的“伪重复”):

SELECT DISTINCT rt.* 
FROM RecipeTable rt
JOIN SyncRecipeIngredientTable srit ON rt.recipe_id = srit.recipe_id
JOIN RecipeIngredientTable rit ON rit.recipe_ingredient_id = srit.recipe_ingredient_id
WHERE rit.recipe_item_name IN ("ayva", "pirinç", "su")
GROUP BY rt.recipe_id
HAVING COUNT(*) >= 3;

我把你的隐式连接改成了显式JOIN,这样可读性更强,也更容易排查问题。

2. 先筛选符合条件的菜谱ID,再关联详情(最严谨的方案)

如果担心COUNT(*)会因为重复配料记录误统计,可以先通过子查询找出真正满足“包含至少3种指定配料”的菜谱ID,再关联RecipeTable获取详情,从根源避免重复:

SELECT rt.*
FROM RecipeTable rt
JOIN (
    -- 子查询:找出拥有至少3种指定配料的菜谱ID
    SELECT srit.recipe_id
    FROM SyncRecipeIngredientTable srit
    JOIN RecipeIngredientTable rit ON rit.recipe_ingredient_id = srit.recipe_ingredient_id
    WHERE rit.recipe_item_name IN ("ayva", "pirinç", "su")
    GROUP BY srit.recipe_id
    -- 用COUNT(DISTINCT)确保同一种配料不会被重复统计
    HAVING COUNT(DISTINCT rit.recipe_item_name) >= 3
) filtered_recipes ON filtered_recipes.recipe_id = rt.recipe_id;

这个方案的好处是,即使某个菜谱里多次使用同一种配料(比如多次加“su”),也不会被重复计数,统计结果更准确。

3. 用窗口函数ROW_NUMBER()去重(灵活扩展方案)

如果你需要保留关联表的部分字段,但每个菜谱只需要一条记录,可以用窗口函数给每个recipe_id的行编号,只取第一行:

SELECT *
FROM (
    SELECT rt.*,
           -- 按recipe_id分组,给每组的行编号
           ROW_NUMBER() OVER (PARTITION BY rt.recipe_id ORDER BY rt.recipe_id) AS row_num
    FROM RecipeTable rt
    JOIN SyncRecipeIngredientTable srit ON rt.recipe_id = srit.recipe_id
    JOIN RecipeIngredientTable rit ON rit.recipe_ingredient_id = srit.recipe_ingredient_id
    WHERE rit.recipe_item_name IN ("ayva", "pirinç", "su")
) temp_table
WHERE row_num = 1;

你可以调整ORDER BY后面的字段,来控制取每组的哪一条记录(比如按菜谱名称排序取第一条)。

为什么你的原查询会出现重复?

你用了隐式的交叉连接(多个表直接写在FROM后),当一个菜谱对应多条符合条件的配料记录时,连接后会生成多条同一菜谱的行。虽然你加了GROUP BY recipe_id,但如果SELECT *包含了其他表的字段(比如配料ID、配料名称),数据库会返回该分组下的任意匹配行,导致同一个recipe_id出现多次,最终产生冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:37:36