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

MySQL查询如何避免返回重复行?求替代新增字段的去重方案

解决MySQL按seller+type组合去重的问题

你核心需求是对seller和type的组合值去重,每组仅保留一行数据,之前用GROUP BY type只按单一字段分组,所以才只返回2条记录,没命中你的实际需求。不用新增字段也能搞定,给你几种常用方法:

方法1:GROUP BY组合字段 + 聚合函数取指定行

直接按seller和type的组合分组,用聚合函数(比如MIN()/MAX())选取每组里的某一行id,再关联原表拿到完整数据:

-- 保留每组id最小的行(想保留最大id就换MAX(id))
SELECT t1.*
FROM table1 t1
JOIN (
    SELECT MIN(id) AS group_id
    FROM table1
    GROUP BY seller, type
) t2 ON t1.id = t2.group_id;

如果只需要seller、type和对应的一个id,也可以简化成:

SELECT MIN(id) AS id, seller, type
FROM table1
GROUP BY seller, type;

方法2:窗口函数(MySQL 8.0+推荐)

如果你的MySQL版本是8.0及以上,窗口函数ROW_NUMBER()会更灵活,能自定义每组内选哪一行(比如按id排序取第一,或按其他字段排序):

SELECT id, seller, type
FROM (
    SELECT *,
           -- 按seller+type分组,每组内按id排序,给每行标序号
           ROW_NUMBER() OVER (PARTITION BY seller, type ORDER BY id) AS row_num
    FROM table1
) temp
WHERE row_num = 1; -- 只取每组的第一行

要是想保留每组里最新的行(假设id越大越新),把ORDER BY id改成ORDER BY id DESC就行,调整起来非常灵活。

为什么你之前的查询不对?

你之前的子查询先排序,再GROUP BY T1.type,但MySQL的GROUP BY会把相同type的行合并成一组,不管seller是否相同——比如type=AB会把seller=234和seller=345的行都合并,自然只返回2条,这和你要的seller+type组合去重完全不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:16